Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Мнемоника команд передачи управления




Обозначение Выполняемая функция
Команды безусловной передачи управления
CALL Вызов подпрограммы
RET Возврат из подпрограммы
INT Вызов программного прерывания
INTO Вызов прерывания переполнения
IRET Возврат из прерывания
JMP Безусловный переход
Команды условного перехода
Jxx Группа команд условного перехода
JCXZ Переход по счетчику
Команды управления циклами
LOOP Цикл с заданным количеством повторений
LOOPE/LOOPZ Цикл до тех пор, пока не нуль
LOOPNE/LOOPNZ Цикл до тех пор, пока нуль

Команда CALL осуществляет передачу управления (вызов) подпрограммы и имеет следующий формат в мнемонике ассемблера:

CALL dest,

где dest – операнд, который прямо или косвенно определяет адрес подпрограммы.

Существуют четыре типа команды CALL:

– прямой внутрисегментный вызов;

– прямой межсегментный вызов;

– косвенный внутрисегментный вызов;

– косвенный межсегментный вызов.

При прямом вызове адрес подпрограммы находится непосредственно в коде команды, а при косвенном вызове – в регистре или в памяти. При внутрисегментном вызове используется только одна компонента адреса: смещение подпрограммы относительно начала текущего кодового сегмента, а при межсегментном вызове – обе компоненты адреса, т.е. сегмент, в котором располагается подпрограмма и ее смещение относительно начала этого сегмента.

В зависимости от типа вызова, команда CALL сохраняет в стеке адрес возврата из подпрограммы, т.е. адрес команды, располагаемой сразу же за командой CALL. При внутрисегментном вызове в стеке сохраняется только смещение адреса возврата, а при межсегментном – еще и текущее значение CS. Затем изменяется значение IP и, если вызов межсегментный, то и CS. Команда CALL не изменяет значение регистра флагов.

Команда CALL имеет следующие форматы машинного кода.

1. Прямой внутрисегментный вызов:

  disp_low disp_high

Поля disp_low и disp_high определяют смещение адреса подпрограммы относительно текущего значения IP.

2. Прямой межсегментный вызов:

  offset_low offset_high seg_low seg_high

Поля seg_low и seg_high определяют сегмент, в котором располагается подпрограмма, а поля offset_low и offset_high – смещение относительно начала этого сегмента.

3. Косвенный внутрисегментный вызов:

  mod 010 r/m disp_low disp_high

Поля mod, r/m, disp_low и disp_high определяют 16-разрядный регистр или ячейку памяти, в которой располагается смещение подпрограммы относительно текущего кодового сегмента.

4. Косвенный межсегментный вызов:

  mod 011 r/m disp_low disp_high

Поля mod, r/m, disp_low и disp_high определяют 32-разрядную ячейку памяти, в которой располагается сегмент и смещение подпрограммы. Смещение располагается в младших байтах этой ячейки памяти, а смещение – в старших байтах.

Если для передачи управления применяется команда CALL, то для возврата из подпрограммы требуется выполнение команды RET соответствующего типа (внутрисегментной или межсегментной). Формат команды CALL выбирается ассемблером на основании типа ее операнда, а формат RET – по контексту на основании типа подпрограммы, в которой текстуально находится RET.


Примеры использования команды CALL:

CALL 0BD4 ; прямой внутрисегментный вызов ; подпрограммы, располагаемой ; по адресу CS:0BD4 h
CALL 0234:0BD4 ; прямой межсегментный вызов ; подпрограммы, располагаемой ; по адресу 0234:0BD4 h
CALL AX ; косвенный внутрисегментный вызов ; подпрограммы, располагаемой ; по адресу CS: AX
CALL word ptr [BX + 12] ; косвенный внутрисегментный вызов
CALL dword ptr [BX + 12] ; косвенный межсегментный вызов

Команда RET осуществляет возврат из подпрограммы в вызвавшую ее программу и имеет следующий формат в мнемонике ассемблера:

RET [data],

где операнд data имеет непосредственную адресацию. Этот операнд необязателен.

Эта команда передает управление по адресу, выбираемому из стека. Допускаются внутрисегментные и межсегментные возвраты, а также возможность прибавления непосредственного значения data к содержимому SP. В случае межсегментного возврата из стека последовательно выбираются значения IP и CS, для внутрисегментного возврата – только IP. Если в команде RET указан операнд (который должен задаваться числовым выражением), то его значение затем прибавляется к содержимому указателя стека. Содержимое регистра флагов при выполнении команды RET не изменяется.

Команда RET имеет следующие форматы машинных кодов:

1) внутрисегментный возврат

 

2) внутрисегментный возврат с добавлением непосредственного значения к указателю стека

  data_low data_high

3) межсегментный возврат

 

4) межсегментный возврат с добавлением непосредственного значения к указателю стека

  data_low data_high

Как было отмечено выше, ассемблер выбирает тип возврата по контексту, в зависимости от типа подпрограммы, в которой текстуально находится RET. В режиме ассемблирования и дизассемблирования DEBUG для обозначения межсегментных возвратов применяется мнемоника RETF.

Примеры использования команды RET:

RET ; внутрисегментный возврат
RET 2 ; внутрисегментный возврат с увеличением SP на 2
RETF ; межсегментный возврат
RETF 2 ; межсегментный возврат с увеличением SP на 2

Команда INT вызывает программное прерывание и имеет следующий формат в мнемонике ассемблера:

INT type,

где type – непосредственный операнд со значением от 0 до 255.

Она записывает в стек содержимое регистра флагов, сбрасывает флаги трассировки (TF) и разрешения прерываний (IF), выполняет косвенный межсегментный вызов подпрограммы-обработчика прерывания через один из 256 возможных векторов прерывания. Таким образом, выполнение команды INT эквивалентно последовательному выполнению команд PUSHF, CLI (сбросить флаг IF) и CALL, если не обращать внимание на флаг TF.

Вектор прерывания – это адрес его обработчика, который располагается в так называемой таблице векторов прерываний – специальной области памяти, которая располагается с самого младшего адреса (0000:0000) и имеет размер 1024 байт. Каждый вектор имеет длину четыре байта. В первом слове хранится значение IP, а во втором – CS. Таким образом, в таблице векторов прерываний имеется место для 256 векторов. Вектор для прерывания 0 начинается с ячейки 0000:0000, прерывания 1 – с 0000:0004, 2 – с 0000:0008 и т.д.

Операнд type команды INT определяет номер вектора в таблице векторов прерываний.


Команда INT имеет следующие форматы машинного кода:

1) при type равно 3

 

2) при t ype не равно 3

  type

Пример использования команды INT:

INT 3 ; вызов прерывания с номером вектора 3
INT 21 ; вызов прерывания с номером вектора 21 h

Команда INTO не имеет операндов. Она вызывает обработчик прерывания переполнения. Вектор этого прерывания равен 4. В целом, эта команда аналогична команде INT 4, за тем лишь исключением, что передача управления обработчику осуществляется, если установлен флаг переполнения (OF). В противном случае команда INTO не выполняет ни каких действий.

Команда INTO имеет следующий формат машинного кода:

 

Пример использования команды INTO:

INTO ; вызов обработчика прерывания переполнения

Команда IRET не имеет операндов. Эта команда используется в обработчиках прерываний для завершения выполнения прерывания и возврата в прерванную программу. Она восстанавливает флаги из стека и передает управление по адресу возврата, запомненному в стеке. Выполнение команды IRET эквивалентно последовательному выполнению команд RET (межсегментный возврат) и POPF.

Команда IRET имеет следующий формат машинного кода:

 

Пример использования команды IRET:

IRET ; возврат из прерывания

Команда JMP выполняет безусловный переход и имеет следующий формат в мнемонике ассемблера:

JMP dest,

где dest – операнд, который прямо или косвенно определяет адрес перехода. Существуют четыре типа команды JMP:

– прямой внутрисегментный переход;

– прямой межсегментный переход;

– косвенный внутрисегментный переход;

– косвенный межсегментный переход.

При прямом переходе адрес передачи управления находится непосредственно в коде команды, а при косвенном переходе – в регистре или в памяти. При внутрисегментном переходе используется только одна компонента адреса: смещение команды, к которой осуществляется переход, относительно начала текущего кодового сегмента, а при межсегментном переходе – обе компоненты адреса, т.е. сегмент, в котором располагается команда, к которой осуществляется переход, и ее смещение относительно начала этого сегмента.

Команда JMP не изменяет значение регистра флагов.

Команда JMP имеет следующие форматы машинного кода.

1. Прямой внутрисегментный переход:

  disp_low disp_high

Поля disp_low и disp_high определяют смещение адреса перехода относительно текущего значения IP.

2. Короткий прямой внутрисегментный переход:

  disp

Поле disp определяет смещение адреса перехода относительно текущего значения IP.

3. Прямой межсегментный переход:

  offset_low offset_high seg_low seg_ high

Поля seg_low и seg_high определяют сегмент, а поля offset_low и offset_high – смещение адреса перехода.

4. Косвенный внутрисегментный переход:

  mod 101 r/m disp_low disp_high

Поля mod, r/m, disp_low и disp_high определяют 16-разрядный регистр или ячейку памяти, в которой располагается смещение адреса перехода.

5. Косвенный межсегментный переход:

  mod 100 r/m disp_low disp_high

Поля mod, r/m, disp_low и disp_high определяют 32-разрядную ячейку памяти, в которой располагается сегмент и смещение адреса перехода. Смещение располагается в младших байтах этой ячейки памяти, а смещение – в старших байтах.

Примеры использования команды JMP:

JMP 0BD4 ; прямой внутрисегментный переход ; к команде, располагаемой по адресу ; CS:0BD4 h
JMP short 0BD4 ; короткий прямой внутрисегментный ; переход; к команде, располагаемой ; по адресу CS:0BD4 h
JMP 0234:0BD4 ; прямой межсегментный переход к ; команде, располагаемой по адресу ; 0234:0BD4 h
JMP AX ; косвенный внутрисегментный переход к ; команде, располагаемой по адресу CS: AX
JMP word ptr [BX + 123] ; косвенный внутрисегментный переход
JMP dword ptr [BX + 123] ; косвенный межсегментный переход

Команды JXX, входящие в группу команд условного перехода, передают управление по адресу своего операнда, когда выполняется некоторое, определяемое мнемоникой, условие, связанное с состоянием регистра флагов. Эти команды имеют следующий формат в мнемонике ассемблера:

JXX disp,

где disp – адресное выражение типа метки с атрибутом NEAR, значение которого лежит в интервале от –128 до 127 от адреса следующей за условным переходом команды.

Все команда условного перехода имеют следующий формат машинного кода:

code disp

Поле code определяет условие перехода, а поле disp – смещение, которое прибавляется к текущему значению IP, если условие истинно. Мнемоника, коды, условия перехода и их смысловые значения для всех команд условного перехода приведены в табл. 7.2.


Таблица 7.2

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...