kursovik (664718), страница 5
Текст из файла (страница 5)
Схема команды: | push источник |
Назначение: размещение содержимого операнда источник в стеке.
Алгоритм работы:
-
уменьшить значение указателя стека esp/sp на 4/2 (в зависимости от значения атрибута размера адреса — use16 или use32);
-
записать источник в вершину стека (адресуемую парой ss:esp/sp).
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команда push используется совместно с командой pop для записи значений в стек и извлечения их из стека. Размер записываемых значений — слово или двойное слово. Также в стек можно записывать непосредственные значения. Заметьте, что в отличие от команды pop в стек можно включать значение сегментного регистра cs. Другой интересный момент связан с регистром sp. Команда push esp/sp записывает в стек значение esp/sp по состоянию до выдачи этой команды. В микропроцессоре i8086 по этой команде записывалось скорректированное значение sp. При записи в стек 8-битных значений для них все равно выделяется слово или двойное слово (в зависимости от use16 или use32).
О б ъ е к т н ы й к о д (три формата):
Регистр: |01010reg|
Сегментный регистр: |000sg111| (sg-сегм.рег.)
Регистр/память: |11111111|mod110r/m|
Пример:
my_proc proc near
push ax
push bx
;тело процедуры, в которой изменяется содержимое
;регистров ax и bx
...
pop bx
pop ax
ret
endp
SHL
(SHift logical Left)
Сдвиг логический операнда влево
Схема команды: | shl операнд,количество_сдвигов |
Назначение: логический сдвиг операнда влево.
Алгоритм работы:
-
сдвиг всех битов операнда влево на один разряд, при этом выдвигаемый слева бит становится значением флага переноса cf;
-
одновременно слева в операнд вдвигается нулевой бит;
-
указанные выше два действия повторяются количество раз, равное значению второго операнда.
Состояние флагов после выполнения команды:
11 | 00 |
OF | CF |
?r | r |
Применение:
Команда shl используется для сдвига разрядов операнда влево. Ее машинный код идентичен коду sal, поэтому вся информация, приведенная для sal, относится и к команде shl. Команда shl используется для сдвига разрядов операнда влево. Так же, как и для других сдвигов, значение второго операнда (счетчикк сдвига) ограничено диапазоном 0...31. Это объясняется тем, что микропроцессор использует только пять младших разрядов операнда количество_разрядов. Аналогично другим командам сдвига сохраняется эффект, связанный с поведением флага of, значение которого имеет смысл только в операциях сдвига на один разряд:
-
если of=1, то текущее значение флага cf и выдвигаемого слева бита операнда различны;
-
если of=0, то текущее значение флага cf и выдвигаемого слева бита операнда совпадают.
Этот эффект, как вы помните, обусловлен тем, что флаг of устанавливается в единицу всякий раз при изменении знакового разряда операнда.
Команду shl удобно использовать для умножения целочисленных операндов без знака на степени 2. Кстати сказать, это самый быстрый способ умножения; умножить содержимое ax на 16 (2 в степени 4).
SHR
Сдвиг логический операнда вправо
ASCII-коррекция после сложения
Схема команды: | shr операнд,кол-во_сдвигов |
Назначение: логический сдвиг операнда вправо.
Алгоритм работы:
-
сдвиг всех битов операнда вправо на один разряд; при этом выдвигаемый справа бит становится значением флага переноса cf;
-
одновременно слева в операнд вдвигается нулевой бит;
-
указанные выше два действия повторяются количество раз, равное значению второго операнда.
Состояние флагов после выполнения команды:
11 | 07 | 06 | 04 | 02 | 00 |
OF | SF | ZF | AF | PF | CF |
?r | r | r | ? | r | r |
Применение:
Команда shr используется для логического сдвига разрядов операнда вправо. Так же, как и для других сдвигов, значение второго операнда (счетчика сдвига) ограничено диапазоном 0...31. Это объясняется тем, что микропроцессор использует только пять младших разрядов операнда количество разрядов. В отличие от других команд сдвига, флаг of всегда сбрасывается в ноль в операциях сдвига на один разряд.
Команду shr можно использовать для деления целочисленных операндов без знака на степени 2.
XOR
Логическое исключающее ИЛИ
ASCII-коррекция после сложения
Схема команды: | xor приемник,источник |
Назначение: операция логического исключающего ИЛИ над двумя операндами размерностью байт, слово или двойное слово.
Алгоритм работы:
-
выполнить операцию логического исключающего ИЛИ над операндами: бит результата равен 1, если значения соответствующих битов операндов различны, в остальных случаях бит результата равен 0;
-
записать результат сложения в приемник;
-
установить флаги.
Состояние флагов после выполнения команды:
11 | 07 | 06 | 04 | 02 | 00 |
OF | SF | ZF | AF | PF | CF |
0 | r | r | ? | r | 0 |
Применение:
Команда xor используется для выполнения операции логического исключающего ИЛИ двух операндов. Результат операции помещается в первый операнд. Эту операцию удобно использовать для инвертирования или сравнения определенных битов операндов.
-
Структура и выполнение EXE-файла.
EXE-модуль, созданный компоновщиком, состоит из следующих двух частей: 1) заголовок - запись, содержащая информацию по управлению и настройке программы и 2) собственно загрузочный модуль.
В заголовке находится информация о размере выполняемого модуля, области загрузки в памяти, адресе стека и относительных смещениях, которые должны заполнить машинные адреса в соответствии с относительными шестнадцатеричными позициями. Для EXE-файла все несколько сложнее чем COM-файл. Общеизвестно что EXE файл отличается от COM файла тем что состоит из двух частей - заголовка, содержащего управляющую информацию для загрузки и самого загружаемого модуля - программы. Программа загружается в память, затем производится настройка адресов в соответствии с ТHА, потом из заголовка берутся значения SS:SP и CS:IP. В ES и DS заносится сегментный адрес PSP. Рассмотрим структуру заголовка EXE файла:
ТАБЛИЦА EXE – ФАЙЛА
Смещение относительно начала(hex) | Содержание | Комментарий |
00-01 | 4D5A - подпись компоновщика (признак EXE файла) | Компоновщик устанавливает этот код для идентификации правильного EXE-файла |
02-03 | Длина последнего блока | Число байтов в последнем блоке EXE-файла |
04-05 | Длина файла в блоках по 512 байт | Число 512 байтовых блоков EXE-файла, включая заголовок |
06-07 | Количество элементов таблицы настройки адресов (Relocation table) | Число настраиваемых элементов |
08-09 | Длина заголовка в параграфах | Число 16-тибайтовых блоков (параграфов) в заголовке, (необходимо для локализации начала выполняемого модуля, следующего после заголовка) |
0A-0B | Минимальный объем памяти который надо выделить после конца программы ( в параграфах) | Минимальное число параграфов, которые должны находится после загруженной программы |
0C-0D | Максимальный объем памяти... | Переключатель загрузки в младшие или старшие адреса. При компоновке программист должен решить, должна ли его программа загружаться для выполнения в младшие адреса памяти или в старшие. Обычным является загрузка в младшие адреса. Значение шест.0000 указывает на загрузку в старшие адреса, а шест. FFFF - в младшие. Иные значения определяют максимальное число параграфов, которые должны находиться после загруженной программы |
0E-0F | Сегментный адрес стека относительно начала программы (SS) | Относительный адрес сегмента стека в выполняемом модуле |
10-11 | Значение SP при запуске | Адрес, который загрузчик должен поместить в регистр SP перед передачей управления в выполнимый модуль |
12-13 | Контрольная сумма - результат сложения без переноса всех слов файла | Контрольная сумма - сумма всех слов в файле (без учета переполнений) используется для проверки потери данных |
14-15 | Значение IP | Относительный адрес, который загрузчик должен поместить в регистр IP до передачи управления в выполняемый модуль |
16-17 | Значение CS | Относительный адрес кодового сегмента в выполняемом модуле. Этот адрес загрузчик заносит в регистр CS |
18-19 | Адрес первого элемента ТHА | Смещение первого настраиваемого элемента в файле. |
1A-1B | Номер сегмента перекрытия | Номер оверлейного фрагмента: нуль обозначает, что заго ловок относится к резидентной части EXE-файла |
1С | Номер сегмента перекрытия | Таблица настройки, содержащая переменное число настраиваемых элементов, соответствующее значению по смещению 06 |
Конец формы
Заголовок имеет минимальный размер 512 байтов и может быть больше, если программа содержит большое число настраиваемых элементов. Позиция 06 в заголовке указывает число элементов в выполняемом модуле, нуждающихся в настройке. Каждый элемент настройки в таблице, начинающейся в позиции 1C заголовка, состоит из двухбайтовых величин смещений и двухбайтовых сегментных значений.
Система строит префикс программного сегмента следом за резидентной частью COMMAND.COM (DOS), которая выполняет операцию загрузки. Затем COMMAND.COM выполняет следующие действия:
- Считывает форматированную часть заголовка в память.