Команда безусловного перехода
Безусловные переходы выполняются с помощью команды JMP (от англ. JuMP – прыгнуть), формат которой показан на рис.9.2.
Рис. 9.2. Формат команды JMP
Адрес перехода чаще всего задается в виде метки. Выполнение команды не оказывает влияния на состояние флагов.
Безусловные переходы могут быть межсегментными (изменяются регистры CS и IP) и внутрисегментными (изменяется только регистр IP). Внутрисегментный переход может быть следующих типов:
– прямой;
– прямой короткий;
– косвенный.
Команда прямого перехода позволяет передавать управление в пределах всего сегмента. В этом случае тип перехода в команде JMP не указывается. Адрес перехода находится в самой команде.
m1: MOV AX,BX
…
JMP m1
Команда прямого короткого перехода применяется, когда расстояние от команды JMP до адреса перехода лежит в пределах –128…+127 байт (примерно 35…45 команд). Адрес перехода находится в самой команде. В отличие от прямого перехода такая команда занимает меньше места (два байта против трех) в памяти и быстрее выполняется. Если адрес перехода расположен до команды JMP, то ассемблер формирует короткую или обычную команду прямого безусловного перехода без дополнительных указаний (так как он уже рассчитал все адреса и знает, на каком расстоянии находится точка перехода от команды JMP). В случае расположения адреса перехода после команды JMP транслятор не может сам определить тип перехода, так как у него еще нет информации об адресе перехода, и по умолчанию он формирует команду прямого перехода. Для того чтобы в этом случае транслятор формировал команду короткого прямого перехода в команде JMP необходимо указывать тип перехода с помощью оператора ptr с типом short (см. разд.7.1):
JMP short ptr m1
…
; 35…45 команд (127 байт)
…
m1:
m2:
…
; 35…45 команд (–128 байт)
…
JMP m2
В случае косвенного перехода в команде JMP указывается не сам адрес перехода, а место где он хранится:
per DW m1
…
JMP per ;переход на метку m1
…
MOV DX,per
JMP DX ;переход на метку m1
…
m1: