FE23 LOOCH DISASMСПРАВОЧНИК ПО КОМАНДАМ
|
Главная | Загрузка | Инструкция | Команды x86 | Карта сайта |
ПЕРЕДАЧИ УПРАВЛЕНИЯ
|
Команда | Выполняемая операция |
JMP | Безусловная передача управления |
CALL | Вызов процедуры |
RET | Возврат из процедуры |
ENTER | Образование стекового кадра для параметров процедуры |
LEAVE | Отмена действия команды ENTER перед выходом из процедуры |
Команда | Тип перехода | Операнд | Код | Формат | |
( 0 ) | JMP | SHORT | (rel8) | EB | |
( 1 ) | JMP | NEAR | (rel16) (rel32) |
E9 | |
( 2 ) | JMP | NEAR, косвенный |
(r/m16) (r/m32) |
FF /100 | |
( 3 ) | JMP | FAR | (ptr16:16) (ptr16:32) |
EA | |
( 4 ) | JMP | FAR, косвенный |
(r/m16) (r/m32) |
FF /101 |
В колонке "Операнд" показано, что является операндом для машинной команды. Размер операнда 16 бит или 32 бита определяется атрибутом размера операнда.
Обозначения (rel8), (rel16), (rel32) - это задание адреса перехода в виде смещения относительно адреса команды, следующей после команды JMP. Задается соответственно в 1 байте, в 2-х байтах, в 4-х байтах.
Обозначения (r/m16), (r/m32) - это регистр или адрес памяти, задаваемые
в поле
Обозначения (ptr16:16), (ptr16:32) - это полный указатель, состоящий из адреса сегмента и смещения относительно начала сегмента.
Вариант ( 0 ). Для короткого SHORT перехода смещение занимает всего 1 байт. Поэтому переход может быть только в пределах от (-128) до (+127).
Вариант ( 1 ). Для близкого NEAR перехода смещение занимает 2 байта или 4 байта. Если смещение из двух байт, переход возможен в пределах от (-32768) до (+32767).
Вариант ( 2 ). Переход косвенный. В команде задан не адрес перехода, а то место (регистр или место в памяти), где можно найти адрес перехода.
В первых трех вариантах переход происходит в пределах того же самого сегмента, в котором выполняется команда JMP. При таком переходе содержимое регистра CS не изменяется.
В следующих двух вариантах выполняется далекий FAR переход (межсегментный).
Вариант ( 3 ). В машинной команде задан полный указатель, то есть, задан сегмент и адрес в этом сегменте. В режие "16 бит" полный указатель (ptr16:16) занимет четыре байта, в режие "32 бита" полный указатель (ptr16:32) занимает шесть байт.
Вариант ( 4 ). Переход косвенный. В команде задан не адрес перехода, а то место, где можно найти полный указатель для перехода. Это место непременно должно быть в памяти, а не в регистре, так как в регистре полный указатель не помещается.
Команда | Тип перехода | Операнд | Код | Формат | |
( 1 ) | CALL | NEAR | (rel16) (rel32) |
E8 | |
( 2 ) | CALL | NEAR, косвенный |
(r/m16) (r/m32) |
FF /010 | |
( 3 ) | CALL | FAR | (ptr16:16) (ptr16:32) |
9A | |
( 4 ) | CALL | FAR, косвенный |
(r/m16) (r/m32) |
FF /011 |
Нетрудно заметить, что эта таблица для команды CALL очень похожа
на предыдущую таблицу для команды JMP. Отличие только в том, что
для команды CALL нет варианта
Остальные четыре варианта полностью одинаковые для команды JMP и для команды CALL. Полностью совпадают типы перехода, типы операнда, формат машинной команды. (Понятно, что коды операций для команд JMP и CALL разные).
Все пояснения после таблицы для команды JMP для вариантов
Как известно, вызов процедуры - это переход с возвратом. Возврат должен происходить на команду, следующую за командой CALL. При выполнении команды CALL адрес для возврата сохраняется в стеке.
При далеких FAR вызовах процедуры в стеке сохраняется еще и значение сегмента CS, причем в стек сначала заносится CS, а затем EIP (или IP для режима "16 бит").
Команда | Тип | Операнд | Код | Формат |
RET/RETN | NEAR | C3 | ||
RET/RETN | NEAR | (imm16) | C2 | |
RET/RETF | FAR | CB | ||
RET/RETF | FAR | (imm16) | CA |
Имеется четыре разных кода операции для команды RET, эти машинные команды выполняются немного по-разному.
При близком NEAR возврате из стека извлекается значение для EIP, при этом значение CS остается неизменным. При далеком FAR возврате из стека извлекается значение для EIP, а затем значение для CS.
Тип возврата из процедуры - близкий NEAR или далекий FAR - должен соответствовать типу вызова процедуры командой CALL. Обычно ассемблер позволяет добавлять к имени команды RET букву "N" или "F" для указания типа возврата.
На языке ассемблера у команды RET может быть необязательный численный параметр, который показывает, сколько байт (для режима "16 бит") или слов (для режима "32 бита") нужно дополнительно освободить в стеке после извлечения из стека адреса для возврата. Таким образом в стеке освобождается место, которое занимали параметры процедуры. (Обычно перед вызовом процедуры в стек заносятся значения параметров этой процедуры).
Команда | Код | Формат | ||
ENTER | C8 | |||
LEAVE | C9 |
Стековый кадр - это некий программный механизм, позволяющий выделить в стеке место для динамического размещения в стеке локальных переменных процедуры. Команды ENTER и LEAVE предоставляют аппаратную поддержку для этого механизка и облегчают программирование.
Команда ENTER ставится в начале процедуры. Она подготавливает стековый кадр к работе. Команда LEAVE ставится перед выходом из процедуры, причем ставится перед каждой командой RET, если выходов несколько. Она восстанавливает прежнюю ситуацию в стеке.
Команда ENTER имеет два параметра. Первый параметр задает количество байт, которое нужно зарезервировать для локальных переменных данной процедуры. Второй параметр обычно бывает равен нулю.
Главная | Загрузка | Инструкция | Команды x86 | Карта сайта |