Формат команды:
DIV BL (AL = AX/BL)
DIV BX (AX= <DX,AX>/BX)
DIV MEMW (AX= <DX,AX>/MEMW)
SBW - преобразование байта в слово.
SBD - преобразование слова в двойное слово.
Деление в ASCI кодах.
AAD - Команда коррекции деления в неупакованной форме.
Команда коррекции деления AAD выполняется до непосредственного деления. Предварительно слова переводятся в распакованный десятичный формат. Содержимое AH умножается на 10 и прибавляется к содержимому AL, то есть получается двоичный код.
13)
14) Цепочечные команды. Префиксы повторения в цепочечных командах.
Под цепочкой понимается последовательность байт или слов в памяти, а цепочной операцией называется команда, выполняемая над элементом цепочки. Для обработки строковых данных ассемблер имеет пять команд обработки строк:
MOVS переслать один байт или одно слово из одной области памяти в другую;
LODS загрузить из памяти один байт в регистр AL или одно слово в регистр AX;
STOS записать содержимое регистра AL или AX в память;
CMPS сравнить содержимое двух областей памяти, размером в один байт или в одно слово;
SCAS сравнить содержимое регистра AL или AX с содержимым памяти.
INSB считать из входного порта в приемник по адресу [di]
OUTS вывести из источника по адресу [si] в порт.
LODS считать из источника по адресу [si] в AL.
STOS сохранить содержимое AL в приемнике по адресу [di].
Эти команды предполагают, что регистры SI и DI содержат относительные
адреса, указывающие на необходимые области памяти. Регистр SI связан с регистром сегмента данных DS:SI, а регистр DI с регистром дополнительного сегмента ES:DI.
Следовательно, при использовании в программе цепочных команд необходимо инициализировать регистр ES. Цепочные команды выполняются с модификацией индексных регистров, и выполняют действие над одним байтом или словом. Чтобы обеспечить цикл используют префикс повторения REP. Длина цикла заносится в регистр СХ. При выполнении цепочной команды с префиксом REP СХ уменьшается на 1. Таким образом, можно обрабатывать цепочку любой длины. Модификация индексных регистров зависит от состояния флага DF. Флаг направления DF определяет направление повторяющейся операции:
1) если DF=0, то индексные регистры инкрементируются.
2) если DF=1, то индексные регистры декрементируются.
Установка DF осуществляется с помощью команд: CLD (DF:=0) и STD (DF:=1).
16) см. 5 и 7
17 и 37) Программы.COM и.EXE формата (структура, размер). Префикс программного сегмента(PSP). Чтение параметров командной строки в PSP.
Программы.com и.exe форматов – исполняемые программы. COM всегда меньше по объему, чем EXE-формате. Программы типа com являются односегментными. Это и программа, и данные, и стек размещаются в одном сегменте.
Программы типа exe состоят из 2-х частей:
Заголовок – записи, содержащие информацию по управлению и настройкам программы, такие как характеристики программы (длина, контрольная сумма, точки входа и т.д.) и данные о настройках программы при ее загрузке в память.
Собственно загрузочный модуль.
Необходимость считывать и обрабатывать информацию заголовка удлиняет процесс загрузки, но программа оказывается более мобильной, т.к. ее отдельные сегменты могут быть загружены в несвязанные участки памяти.
Заголовок имеет минимальный размер 512 байт.
Программа типа com не имеет заголовка, что обеспечивает более эффективную ее работу.
Hello.exe 550 байт
Hello.com 25-30 байт
Формат com используется в основном при написании очень маленьких программ и написании драйверов, обработчиков прерываний других резидентных программ.
В com место под префикс программного сегмента (PSP) резервирует программист, начиная программу директивой ORG 100h. Таким образом PSP включается в область сегмента программы.
Любая программа содержит специальную таблицу PSP, имеющую размер 256 байт.
В exe место под PSP не резервируется. Он пристраивается к программе в процессе загрузки.
Указатель стека на конец сегмента. Граница между программой и стеком условна.
Основа вирусов – засорение стека.
Префикс программного сегмента (PSP)
Префикс состоит из 256 (100h) байт.
00 – int 20 – выход из подпрограммы.
02 – общий размер доступной памяти (кратное 16)
0Аh-0Dh – содержимое вектора прерывания по завершению программы.
0Еh – содержимое вектора прерывания по Ctrl/C
12h-15h -------//-------- по критической ошибке.
2Сh-2Dh – сегментный адрес блока памяти с окружением данного процесса
Окружение – информация о процессе.
80h-FFh – хвост команды или дисковая область передачи данных
На PSP указывает регистр ES. По адресу ES: [80h] находится количество байт, содержащееся в хвосте без учёта символа <Enter>
18) Подпpогpаммы. Типы вызовов подпpогpамм. Передача паpаметpов в подпpогpаммы.
Для идентификации подпрограмм используется директива
PROC – начало п/п
ENDP – конец п/п
Формат:
Имя PROC Тип перехода
Тело п/п
------------------------------
RET
Имя ENDP
Типы перехода: 1) Near; 2) Far
Переходы бывают короткими и длинными. Короткие – по умолчанию ±127 байт (near). Дальние (far) – переход с учётом сегментного регистра.
Команды возврата не имеют типа перехода. Вызов п/п осуществляется командой CALL (Call <имя> – команда обеспечивает:
1) сохранение адреса возврата в стеке (регистр IP);
2) запуск выполнения вызываемой процедуры, то есть загрузку в IP нового адреса)
RET – осуществляет выборку из стека адреса возврата и загрузку его в IP.