Мнемоника команд передачи управления
Команда CALL осуществляет передачу управления (вызов) подпрограммы и имеет следующий формат в мнемонике ассемблера: CALL dest, где dest – операнд, который прямо или косвенно определяет адрес подпрограммы. Существуют четыре типа команды CALL: – прямой внутрисегментный вызов; – прямой межсегментный вызов; – косвенный внутрисегментный вызов; – косвенный межсегментный вызов. При прямом вызове адрес подпрограммы находится непосредственно в коде команды, а при косвенном вызове – в регистре или в памяти. При внутрисегментном вызове используется только одна компонента адреса: смещение подпрограммы относительно начала текущего кодового сегмента, а при межсегментном вызове – обе компоненты адреса, т.е. сегмент, в котором располагается подпрограмма и ее смещение относительно начала этого сегмента. В зависимости от типа вызова, команда CALL сохраняет в стеке адрес возврата из подпрограммы, т.е. адрес команды, располагаемой сразу же за командой CALL. При внутрисегментном вызове в стеке сохраняется только смещение адреса возврата, а при межсегментном – еще и текущее значение CS. Затем изменяется значение IP и, если вызов межсегментный, то и CS. Команда CALL не изменяет значение регистра флагов.
Команда CALL имеет следующие форматы машинного кода. 1. Прямой внутрисегментный вызов:
Поля disp_low и disp_high определяют смещение адреса подпрограммы относительно текущего значения IP. 2. Прямой межсегментный вызов:
Поля seg_low и seg_high определяют сегмент, в котором располагается подпрограмма, а поля offset_low и offset_high – смещение относительно начала этого сегмента. 3. Косвенный внутрисегментный вызов:
Поля mod, r/m, disp_low и disp_high определяют 16-разрядный регистр или ячейку памяти, в которой располагается смещение подпрограммы относительно текущего кодового сегмента. 4. Косвенный межсегментный вызов:
Поля mod, r/m, disp_low и disp_high определяют 32-разрядную ячейку памяти, в которой располагается сегмент и смещение подпрограммы. Смещение располагается в младших байтах этой ячейки памяти, а смещение – в старших байтах. Если для передачи управления применяется команда CALL, то для возврата из подпрограммы требуется выполнение команды RET соответствующего типа (внутрисегментной или межсегментной). Формат команды CALL выбирается ассемблером на основании типа ее операнда, а формат RET – по контексту на основании типа подпрограммы, в которой текстуально находится RET. Примеры использования команды CALL:
Команда RET осуществляет возврат из подпрограммы в вызвавшую ее программу и имеет следующий формат в мнемонике ассемблера:
RET [data], где операнд data имеет непосредственную адресацию. Этот операнд необязателен. Эта команда передает управление по адресу, выбираемому из стека. Допускаются внутрисегментные и межсегментные возвраты, а также возможность прибавления непосредственного значения data к содержимому SP. В случае межсегментного возврата из стека последовательно выбираются значения IP и CS, для внутрисегментного возврата – только IP. Если в команде RET указан операнд (который должен задаваться числовым выражением), то его значение затем прибавляется к содержимому указателя стека. Содержимое регистра флагов при выполнении команды RET не изменяется. Команда RET имеет следующие форматы машинных кодов: 1) внутрисегментный возврат 2) внутрисегментный возврат с добавлением непосредственного значения к указателю стека
3) межсегментный возврат 4) межсегментный возврат с добавлением непосредственного значения к указателю стека
Как было отмечено выше, ассемблер выбирает тип возврата по контексту, в зависимости от типа подпрограммы, в которой текстуально находится RET. В режиме ассемблирования и дизассемблирования DEBUG для обозначения межсегментных возвратов применяется мнемоника RETF. Примеры использования команды RET:
Команда 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
Пример использования команды INT:
Команда INTO не имеет операндов. Она вызывает обработчик прерывания переполнения. Вектор этого прерывания равен 4. В целом, эта команда аналогична команде INT 4, за тем лишь исключением, что передача управления обработчику осуществляется, если установлен флаг переполнения (OF). В противном случае команда INTO не выполняет ни каких действий. Команда INTO имеет следующий формат машинного кода: Пример использования команды INTO:
Команда IRET не имеет операндов. Эта команда используется в обработчиках прерываний для завершения выполнения прерывания и возврата в прерванную программу. Она восстанавливает флаги из стека и передает управление по адресу возврата, запомненному в стеке. Выполнение команды IRET эквивалентно последовательному выполнению команд RET (межсегментный возврат) и POPF. Команда IRET имеет следующий формат машинного кода: Пример использования команды IRET:
Команда JMP выполняет безусловный переход и имеет следующий формат в мнемонике ассемблера: JMP dest, где dest – операнд, который прямо или косвенно определяет адрес перехода. Существуют четыре типа команды JMP: – прямой внутрисегментный переход; – прямой межсегментный переход; – косвенный внутрисегментный переход; – косвенный межсегментный переход. При прямом переходе адрес передачи управления находится непосредственно в коде команды, а при косвенном переходе – в регистре или в памяти. При внутрисегментном переходе используется только одна компонента адреса: смещение команды, к которой осуществляется переход, относительно начала текущего кодового сегмента, а при межсегментном переходе – обе компоненты адреса, т.е. сегмент, в котором располагается команда, к которой осуществляется переход, и ее смещение относительно начала этого сегмента.
Команда JMP не изменяет значение регистра флагов. Команда JMP имеет следующие форматы машинного кода. 1. Прямой внутрисегментный переход:
Поля disp_low и disp_high определяют смещение адреса перехода относительно текущего значения IP. 2. Короткий прямой внутрисегментный переход:
Поле disp определяет смещение адреса перехода относительно текущего значения IP. 3. Прямой межсегментный переход:
Поля seg_low и seg_high определяют сегмент, а поля offset_low и offset_high – смещение адреса перехода. 4. Косвенный внутрисегментный переход:
Поля mod, r/m, disp_low и disp_high определяют 16-разрядный регистр или ячейку памяти, в которой располагается смещение адреса перехода. 5. Косвенный межсегментный переход:
Поля mod, r/m, disp_low и disp_high определяют 32-разрядную ячейку памяти, в которой располагается сегмент и смещение адреса перехода. Смещение располагается в младших байтах этой ячейки памяти, а смещение – в старших байтах. Примеры использования команды JMP:
Команды JXX, входящие в группу команд условного перехода, передают управление по адресу своего операнда, когда выполняется некоторое, определяемое мнемоникой, условие, связанное с состоянием регистра флагов. Эти команды имеют следующий формат в мнемонике ассемблера: JXX disp, где disp – адресное выражение типа метки с атрибутом NEAR, значение которого лежит в интервале от –128 до 127 от адреса следующей за условным переходом команды. Все команда условного перехода имеют следующий формат машинного кода:
Поле code определяет условие перехода, а поле disp – смещение, которое прибавляется к текущему значению IP, если условие истинно. Мнемоника, коды, условия перехода и их смысловые значения для всех команд условного перехода приведены в табл. 7.2.
Таблица 7.2
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|