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


Основной инструкцией перехода в наборе инструкций процессора 8086 является инструкция JMP. Эта инструкция указывает процессору 8086, что в качестве следующей за JMP инструкцией нужно выполнить инструкцию по целевой метке. Например, после завершения выполне-ния фрагмента программы:

 

mov ax,1

jmp AddTwoToAX

AddOneToAx:

inc ax

jmp AXIsSet

AddTwoToAX:

inc ax AXIsSet:

регистр AX будет содержать значение 3, а инструкции ADD и JMP, следующие за меткой AddOneToAX, никогда выполнены не будут. Здесь инструкция:

jmp AddTwoToAX

указывает процессору 8086, что нужно установить указатель инст-рукций IP в значение смещения метки AddTwoToAX, поэтому следующей выполняемой инструкцией будет инструкция:

add ax,2

Иногда совместно с инструкцией JMP используется операция SHORT. Для указания на целевую метку инструкция JMP обычно ис-пользует 16-битовое смещение. Операция SHORT указывает Турбо Ас-семблеру, что нужно использовать не 16-битовое, а 8-битовое сме-щение (что позволяет сэкономить в инструкции JMP один байт). Нап-ример, последний фрагмент программы можно переписать так, что он станет на два байта короче:

mov ax,1

jmp SHORT AddTwoToAX

AddOneToAx:

inc ax

jmp SHORT AXIsSet

AddTwoToAX:

inc ax AXIsSet:

 

Недостаток использования операции SHORT (короткий) состоит в том, что короткие переходы могут осуществлять передачу управления на метки, отстоящие от инструкции JMP не далее, чем на 128 бай-тов, поэтому в некоторых случаях Турбо Ассемблер может сообщать вам, что метка недостижима с помощью короткого перехода. К тому же операцию SHORT имеет смысл использовать для ссылок вперед, поскольку для переходов назад (на предшествующие метки) Турбо Ас-семблер автоматически использует короткие переходы, если на метку можно перейти с помощью короткого перехода, и длинные в противном случае.

Инструкцию JMP можно использовать для перехода в другой сег-мент кода, загружая в одной инструкции и регистр CS, и регистр IP. Например, в программе:

.

CSeg1 SEGMENT

ASSUME CS:Cseg1

 

FarTarget LABEL FAR

CSeg1 ENDS

CSeg2 SEGMENT

ASSUME CS:CSeg2

.

jmp FarTarget ; переход дальнего типа

.

 

CSeg2 ENDS

.выполняется переход дальнего типа.

Если вы хотите, чтобы метка принудительно интерпретирова-лась, как метка дальнего типа, можно использовать операцию FAR PTR. Например, во фрагменте программы:

.

.jmp FAR PTR NearLabel

nop

NearLabel:

.

.выполняется переход дальнего типа на метку NearLabel, хотя эта метка находится в том же сегменте кода, что и инструкция JMP.

Наконец, вы можете выполнить переход по адресу, записанному в регистре или в переменной памяти. Например:

.mov ax,OFFSET TestLabel

jmp ax

.TestLabel:

.

.Здесь выполняется переход на метку TestLabel, так же, как и в следующем фрагменте:

..DATA

JumpTarget DW TestLabel

.

..CODE

.jmp [JumpTarget]

.TestLabel:

.

Загрузка...