Основные сведения
Большинство программ содержат циклы, в которых несколько команд повторяются до достижения определенного требования, и различные проверки, определяющие, какие из нескольких действий следует выполнять. Управление передается по адресу команды, которая не находится непосредственно за выполняемой в текущий момент командой. Такая передача может осуществляться вперед для выполнения новой группы команд или назад для повторения уже выполненных команд [6].
Ниже приведены четыре способа передачи управления:
Безусловный переход: JMP
Цикл: LOOP
Условный переход: Jnnn (больше, меньше, равно)
Вызов процедуры: CALL
Заметим, что имеется три типа адресов: SHORT (короткий), NEAR (близкий) и FAR (дальний). Адресация SHORT используется при циклах, условных переходах и некоторых безусловных переходах. Адресация NEAR и FAR используется для вызовов процедур (CALL) и безусловных переходов, которые не квалифицируются, как SHORT. Все три типа передачи управления воздействуют на содержимое регистра IP; тип FAR также изменяет регистр CS.
Команда JMP
Одной из команд, обычно используемых для передачи управления, является команда JMP. Эта команда выполняет безусловный переход, т.е. обеспечивает передачу управления в любом случае.
В программе 7.1 показан пример бесконечного цикла с использованием команды JMP. В регистры AX, BX, и CX загружается значение 1, и затем в цикле выполняются следующие операции: прибавить 1 к регистру AX; прибавить AX к BX; удвоить значение в регистре CX. Повторение цикла приводит к увеличению содержимого регистра AX: 1,2,3,4..., регистра BX: 1,3,6,10..., и регистра CX: 1,2,4,8... Начало цикла имеет метку, в данном случае, "A20:". В конце цикла находится команда JMP A20, которая указывает на то, что управление должно быть передано команде с меткой A20. Адресная метка в операнде команды указывается без двоеточия. Данный цикл не имеет выхода и приводит к бесконечному выполнению - такие циклы в программах для PC обычно не используются.
Пример 7.1. Использование команды JMP.
masm
model small
.code
start:
mov ax,01; инициализация ax,
mov bx,01; bx,
mov cx,01; и cx
a20:
add ax,01; ax = ax + 1
add bx,ax; bx = ax + bx
shl cx,1; удвоить cx
jmp a20; переход на a20
end start
Команда JMP для перехода в пределах -128 до +127 байт имеет тип SHORT. Более далекие безусловные переходы имеют тип NEAR. Команда JMP, превосходящая пределы одного сегмента, получает тип FAR.