Вопрос № 101573: Уважаемые эксперты.
Вопрос у меня такой. 2 винта.На каждом из них Винда, которая ставилась по отдельности.
Нужно что бы при старте, при нажатии определенной кнопки "C" или "D"
грузилась винда соответсвуюшего диска ...Вопрос № 101595: Вечер добрый!
Совершенно непонятно, почему при написании минимальной оконной программы на ассемблере размер файла 2,5 кб, а на языке C ЗНАЧИТЕЛЬНО больше?
Это недостаток всех ЯПВУ или недоработка компиляторов?
Какую дополн...Вопрос № 101681: Добрый день.
Хотел бы попросить рассказать мне немного (или дать ссылку) о том, как можно сделать, чтобы я например в одном .asm файле описывал процедуры, а в другом их просто мог вызывать?
т.е. что-то типа import procs.asm
Компилятор и л...
Вопрос № 101.573
Уважаемые эксперты.
Вопрос у меня такой. 2 винта.На каждом из них Винда, которая ставилась по отдельности.
Нужно что бы при старте, при нажатии определенной кнопки "C" или "D"
грузилась винда соответсвуюшего диска
;BIOS загружает 1 сектор с первого жесткого диска MBR по адресу 0000:7с00h
;затем копирует сам себя в 0000:0600h откуда и начинает выполнение ???
Добавим в начало MBR такой код
mov ax,0
int 16h
cmp ah,'D' ; Сравниваем нажатую клавишу или D или C
je D ; и делаем соответствуюший переход
cmp ah,'c' ;
je C
D:
mov ah,2 ;читаем
mov al,1 ;читаем один первый сектор 512 байт
mov es,_segment ;сегмент 0000
mov bx,_offset ;и смещение буфера куда читаем 0600H
mov cl,1 ;номер сектора (для mbr это 1)
mov ch,0 ;номер дорожки
mov dh,0 ;номер головки
mov dl,81h ; второй жесткий диск
int 13h
jmp 0000:0600h ; переходим на выполнение MBr со второго диска, остальное он сделает сам
C:
;с этого места выполняется стандартный MBR
;Остается перевести в Hex машинный код и например DiskEdit-записать в начало
;предварительно сократив немного "системные сообшения" типа Invalid Partition Table заменив на IVP например.
Будет работать такая штука ?
Отправлен: 10.09.2007, 20:23
Вопрос задал: Olmel (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 16)
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Olmel!
Вам нужно:
1) Внимательно изучить MBR на диске С:, особенно обьязательные структуры.
Для Вашего кода нужно освободить 40 байт и он должен быть расположен после копирования в другое место (т.к. после выполнения команды int 13h старый код будет затерт и неизвестно какая команда будет в точке возврата). Если поработать над ним, то можно его сократить (оставить только 28-29, байт смотрите приложение), к примеру: 53 0058 B1 01 mov cl,1;номер сектора (для mbr это 1) 54 005A B5 00 mov ch,0;номер дорожки
итого 4 байта 56 005E B9 0001 mov cx,1
итого 3 байта.
2) MBR диска D: нужно загружать по адресу 0000:7С00 и передавать ему управление, он сам себя скопирует куда нужно.
3) Загрузчики операционных систем:
-9х простые и очень любят перезаписывать свой загрузчик не обращая внимание на содержимое MBR;
-ХР сложнее. Две ссылки по загрузке ОСей WindowsServer2003 и Windows2000(могут быть полезными).
4) Сохраните важную информацию расположенную на диске С:, а вдруг.
--------- И только наступив на грабли мы приобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Специалист)
Ответ отправлен: 12.09.2007, 14:43 Оценка за ответ: 5 Комментарий оценки: спасибо за ответ спасибо за статью ХОРОШАЯ СТАТЬЯ завтра дочитаю и напишу все по новой Но сначала вопрос где взять описание вот этих цифирек 53 0058 B1 01 например я имею вввиду всех команд описание в hex Спасибо!!
Вопрос № 101.595
Вечер добрый!
Совершенно непонятно, почему при написании минимальной оконной программы на ассемблере размер файла 2,5 кб, а на языке C ЗНАЧИТЕЛЬНО больше?
Это недостаток всех ЯПВУ или недоработка компиляторов?
Какую дополнительную информацию компиляторы вкладывают в файл программы? Это балласт или действительно полезно?
Отправлен: 11.09.2007, 01:08
Вопрос задал: Dmitry R (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Dmitry R!
С точки зрения размера - зто недостаток всех ЯВУ.
За обеспечение какого-то набора стандартных возможностей и функций
приходится платить.
Все не перечислю, но некоторые:
1.Создание кучи
2.Разбор параметров командной строки
3.Отработка исключений (например, деление на 0)
4....
В ассемблерных программах такой стандартный набор не нужен,
добавляется программистом по необходимости.
А вот в ЯВУ не обойтись, поэтому и вставляется в каждую программу.
Кстати, наличие стандартных возможностей предусмотрено стандартом С.
--------- Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Практикант)
Ответ отправлен: 11.09.2007, 11:49 Оценка за ответ: 5 Комментарий оценки: Отвечено на все вопросы с достаточной подробностью.
Довольно странно, что в современных пакетах отсутствует возможность отказаться от вставки тех частей программы, которые иногда совершенно бесполезны. По-моему, в этом прослеживается некоторая недоработка компиляторов.
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Dmitry R!
Компиляторы ЯВУ вставляют свой стартовый и завершающий код, основная задача которого определить параметры среды, параметры коммандной строки, версию операционной системы, подготовить основную программу к выполнению и потом корректно ее завершить (даже если была критическая ошибка). В программах на ассемблере за обработку ошибок отвечает программист.
В приложениии не полный листинг программы на Паскале полученый с помощью IDA: program a;
begin
end;
Обратите внимание на имена фунций которые не используются.
Размер программы (которая запускается и сразу завершается) 1632 байта.
Для сравнения прикрепляю аналогичную программу на ассемблере.
Удачи!
Приложение:
Прикреплённый файл: Загрузить >> Срок хранения файла на сервере RusFAQ.ru составляет 30 суток с момента отправки ответа. --------- И только наступив на грабли мы приобретаем драгоценный опыт!
Добрый день.
Хотел бы попросить рассказать мне немного (или дать ссылку) о том, как можно сделать, чтобы я например в одном .asm файле описывал процедуры, а в другом их просто мог вызывать?
т.е. что-то типа import procs.asm
Компилятор и линкер Tasm32 и Tlink32
И еще хотел бы узнать, где взять просто win32api, желательно на русском.
Спасибо!
Отправлен: 11.09.2007, 17:35
Вопрос задал: Alexey B (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Egugondiy
Здравствуйте, Alexey B!
1. У вас есть основной файл, например hello.asm. Создаете файл proc.asm куда помещаете необходимые процедуры. Пишите в основном файле в сегменте кода:
include proc.asm
Если вы имеете ввиду создание собственных динамических библиотек(DLL), то почитайте здесь:
http://www.wasm.ru/article.php?article=1001017
2.Справочник по функциям API на английском:
http://cracklab.ru/download.php?action=get&n=NjA1
на русском:http://megalib.com/books/903/delphi_api.zip
Русский on-line справочник на cracklab.ru:
http://cracklab.narod.ru/api/
Ответ отправил: Egugondiy (статус: 1-ый класс)
Ответ отправлен: 11.09.2007, 18:00
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Alexey B!
Компиляция в один файл:
Директива PUBLIC указанная метка становится доступной для других модулей программы.
Директива EXTRN описывает метку, определенную в другом модуле (с помощью PUBLIC).
Директива GLOBAL действует, как PUBLIC и EXTRN одновременно.
Директива COMM описывает общую переменную.
Компиляция в разные файлы:
-создается библиотека A.DLL с экспортируемыми функциями
-создается A.LIB с помощью IMPLIB из динамической библиотеки
-в своей программе Вы подключаете A.LIB директивой INCLUDELIB
Пример создания библиотеки(глава 7.4) и описание директив(глава 3.3.8) в книге Зубкова.
Для каждого примера есть варианты команд компилятора TASM.
Интернет справочники по основным функциям API: первый и второй
Удачи!
--------- И только наступив на грабли мы приобретаем драгоценный опыт!