FE23  LOOCH  DISASM

СПРАВОЧНИК  ПО  КОМАНДАМ
ПРОЦЕССОРОВ  x86

(empty)
Главная Загрузка Инструкция Команды x86 Карта сайта

 

ПЕРЕДАЧИ  УПРАВЛЕНИЯ
И  ВЫЗОВЫ  ПРОЦЕДУР


К группе "Переходы и процедуры" в данном справочнике отнесены следующие пять команд:

 Команда Выполняемая операция
  JMP  Безусловная передача управления
  CALL  Вызов процедуры
  RET  Возврат из процедуры
  ENTER  Образование стекового кадра для параметров процедуры
  LEAVE  Отмена действия команды ENTER перед выходом из процедуры

Команда безусловной передачи управления

  Команда Тип перехода  Операнд Код Формат
 ( 0 )  JMP  SHORT  (rel8)   EB    --------  addr(1) 
 ( 1 )  JMP  NEAR   (rel16)
 (rel32)
  E9    --------  addr(2/4) 
 ( 2 )  JMP  NEAR,
 косвенный 
 (r/m16)
 (r/m32)
  FF  /100   --------  NNN 
 ( 3 )  JMP  FAR  (ptr16:16)
 (ptr16:32)
  EA    --------  addr(4/6) 
 ( 4 )  JMP  FAR,
 косвенный 
 (r/m16)
 (r/m32)
  FF  /101   --------  NNN 

В колонке "Операнд" показано, что является операндом для машинной команды. Размер операнда 16 бит или 32 бита определяется атрибутом размера операнда.

Обозначения (rel8), (rel16), (rel32) - это задание адреса перехода в виде смещения относительно адреса команды, следующей после команды JMP. Задается соответственно в 1 байте, в 2-х байтах, в 4-х байтах.

Обозначения (r/m16), (r/m32) - это регистр или адрес памяти, задаваемые в поле (r/m) байта (mod,reg,r/m).

Обозначения (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    --------  addr(2/4) 
 ( 2 )  CALL  NEAR,
 косвенный 
 (r/m16)
 (r/m32)
  FF  /010   --------  NNN 
 ( 3 )  CALL  FAR  (ptr16:16)
 (ptr16:32)
  9A    --------  addr(4/6) 
 ( 4 )  CALL  FAR,
 косвенный 
 (r/m16)
 (r/m32)
  FF  /011   --------  NNN 

Нетрудно заметить, что эта таблица для команды CALL очень похожа на предыдущую таблицу для команды JMP. Отличие только в том, что для команды CALL нет варианта ( 0 ) с адресом типа SHORT.

Остальные четыре варианта полностью одинаковые для команды JMP и для команды CALL. Полностью совпадают типы перехода, типы операнда, формат машинной команды. (Понятно, что коды операций для команд JMP и CALL разные).

Все пояснения после таблицы для команды JMP для вариантов ( 1 ), ( 2 ), ( 3 ), ( 4 ) полностью подходят и для команды CALL.

Как известно, вызов процедуры - это переход с возвратом. Возврат должен происходить на команду, следующую за командой CALL. При выполнении команды CALL адрес для возврата сохраняется в стеке.

При далеких FAR вызовах процедуры в стеке сохраняется еще и значение сегмента CS, причем в стек сначала заносится CS, а затем EIP (или IP для режима "16 бит").

Команда возврата из процедуры

 Команда Тип  Операнд Код Формат
  RET/RETN    NEAR     C3    --------  
  RET/RETN    NEAR  (imm16)   C2    --------  data(2) 
  RET/RETF    FAR     CB    --------  
  RET/RETF    FAR  (imm16)   CA    --------  data(2) 

Имеется четыре разных кода операции для команды RET, эти машинные команды выполняются немного по-разному.

При близком NEAR возврате из стека извлекается значение для EIP, при этом значение CS остается неизменным. При далеком FAR возврате из стека извлекается значение для EIP, а затем значение для CS.

Тип возврата из процедуры - близкий NEAR или далекий FAR - должен соответствовать типу вызова процедуры командой CALL. Обычно ассемблер позволяет добавлять к имени команды RET букву "N" или "F" для указания типа возврата.

На языке ассемблера у команды RET может быть необязательный численный параметр, который показывает, сколько байт (для режима "16 бит") или слов (для режима "32 бита") нужно дополнительно освободить в стеке после извлечения из стека адреса для возврата. Таким образом в стеке освобождается место, которое занимали параметры процедуры. (Обычно перед вызовом процедуры в стек заносятся значения параметров этой процедуры).

Команды стекового кадра

 Команда Код Формат
  ENTER     C8    --------  data(2)  data(1) 
  LEAVE     C9    --------  

Стековый кадр - это некий программный механизм, позволяющий выделить в стеке место для динамического размещения в стеке локальных переменных процедуры. Команды ENTER и LEAVE предоставляют аппаратную поддержку для этого механизка и облегчают программирование.

Команда ENTER ставится в начале процедуры. Она подготавливает стековый кадр к работе. Команда LEAVE ставится перед выходом из процедуры, причем ставится перед каждой командой RET, если выходов несколько. Она восстанавливает прежнюю ситуацию в стеке.

Команда ENTER имеет два параметра. Первый параметр задает количество байт, которое нужно зарезервировать для локальных переменных данной процедуры. Второй параметр обычно бывает равен нулю.




Основные страницы справочника

Справочник по командам процессоров x86
 
Все команды по алфавиту (кратко)
Все команды по алфавиту (подробно)
Первый байт кода операций
Второй байт кода операций
 


Главная Загрузка Инструкция Команды x86 Карта сайта


 
Copyright (C) FE23 Looch Disasm, 2011
File          - refe31.htm
File created  - 06 Jun 2011
Last modified - 30 Jun 2011
Hosted by uCoz