Инструменты пользователя

Инструменты сайта


examination:asm:question22

Вопрос №22. Команды передачи управления, их классификация. Примеры

Команды передачи управления

Обычно в программе есть точки, в которых нужно принять решение о том, какая команда будет выполняться следующей. Это решение может быть

безусловным — в данной точке необходимо передать управление не той команде, которая идет следующей, а другой, которая находится на некотором удалении от текущей команды;

условным — решение о том, какая команда будет выполняться следующей, принимается на основе анализа некоторых условий или данных.

То, какая команда программы должна выполняться следующей, микропроцессор узнает по содержимому пары регистров cs:(e)ip:

- cs — сегментный регистр кода, в котором находится физический (базовый) адрес текущего сегмента кода;

- eip/ip — регистр указателя команды, в котором находится значение, представляющее собой смещение в памяти следующей команды, подлежащей выполнению, относительно начала текущего сегмента кода.(Какой конкретно регистр будет использоваться, зависит от установленного режима адресации use16 или use32. Если указано use16, то используется ip, если use32, то используется eip.)

Таким образом, команды передачи управления изменяют содержимое регистров cs и eip/ip, в результате чего микропроцессор выбирает для выполнения не следующую по порядку команду программы, а команду в некотором другом участке программы.

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

команда безусловного перехода;

вызова процедуры и возврата из процедуры;

вызова программных прерываний и возврата из программных прерываний.

2.Команды условной передачи управления:

команды перехода по результату команды сравнения cmp;

команды перехода по состоянию определенного флага;

команды перехода по содержимому регистра ecx/cx.

3.Команды управления циклом:

команда организации цикла со счетчиком ecx/cx;

команда организации цикла со счетчиком ecx/cx с возможностью досрочного выхода из цикла по дополнительному условию.

Организация циклов

-loop метка_перехода (Loop) — повторить цикл. Команда позволяет организовать циклы, подобные циклам for в языках высокого уровня с автоматическим уменьшением счетчика цикла. Работа команды заключается в выполнении следующих действий:

-декремента регистра ecx/cx;

-сравнения регистра ecx/cx с нулем:

если (ecx/cx) > 0, то управление передается на метку перехода;

если (ecx/cx) = 0, то управление передается на следующую после loop команду.

Безусловные переходы

-near ptr — прямой переход на метку внутри текущего сегмента кода.

-far ptr — прямой переход на метку в другом сегменте кода.

-word ptr — косвенный переход на метку внутри текущего сегмента кода.

-dword ptr — косвенный переход на метку в другом сегменте кода.

-jmp [модификатор] адрес_перехода - безусловный переход без сохранения информации о точке возврата.

-Процедуры

Условные переходы

cmp операнд_1,операнд_2 (compare) — сравнивает два операнда и по результатам сравнения устанавливает флаги.

Типы операндов\ Мнемокод команды условного перехода\ Критерий условного перехода\ Значения флагов

Любые je операнд_1 = операнд_2 zf = 1

Любые jne операнд_1<>операнд_2 zf = 0

Со знаком jl/jnge операнд_1 < операнд_2 sf <> of

Со знаком jle/jng операнд_1 ⇐ операнд_2 sf <> of or zf = 1

Со знаком jg/jnle операнд_1 > операнд_2 sf = of and zf = 0

Со знаком jge/jnl операнд_1 ⇒ операнд_2 sf = of

Без знака jb/jnae операнд_1 < операнд_2 cf = 1

Без знака jbe/jna операнд_1 ⇐ операнд_2 cf = 1 or zf=1

Без знака ja/jnbe операнд_1 > операнд_2 cf = 0 and zf = 0

Без знака jae/jnb операнд_1 ⇒ операнд_2 cf = 0

пример программы, которая обнуляет поле pole_m длинной n байт:

.data

n equ 50

pole_m db n dup (?)

.code

;…

xor bx, bx ; очищаем bx

m1:

mov mem[bx], 0 ; заносим в mem[bx] 0

inc bx ; увеличение bx на 1

cmp bx, n ; сравниваем bx с n (вычитаем n из bx)

jne m1 ; если bx не равен n, то повторяем все завново

exit:

;…

examination/asm/question22.txt · Последние изменения: 2014/01/15 08:12 (внешнее изменение)