Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Теперь рассмотрим другую разновидность безусловного перехода - косвенный переход. В этом случае в команде перехода указывается не сам адрес перехода, а то место, где находится этот адрес. Таким местом может быть регистр общего назначения или слово памяти:
JMP r16 или JMP m16
В этих командах берется содержимое указанного регистра или слова памяти, оно рассматривается как адрес некоторой команды программы и именно по этому адресу делается переход. Причем этот адрес рассматривается как "настоящий", а не отсчитанный от команды перехода.
Примеры ([х] - содержимое ячейки или регистра х):
A DW L
...
JMP А; goto [A] = goto L
MOV DX,A; DX=L
JMP DX; goto [DX] = goto L
L:...
Косвенные переходы используются в тех случаях, когда адрес перехода становится известным только во время счета программы.
Возьмем команду JMP Z, где Z - некоторое имя (но не имя регистра). Что это такое - прямой переход по метке Z или косвенный переход по адресу из ячейки Z? Если имя Z описано до этой команды, то здесь проблемы нет: если именем Z помечена команда (рис. а), то это переход по метке, а если имя Z описано в директиве DW (рис. б), то это косвенный переход.
Z: INC AX Z DW L JMP Z; goto?… … … JMP Z;goto Z JMP Z;goto L Z …a) б) в)Но если Z - ссылка вперед, т. е. это имя описывается позже (рис. в), тогда ассемблер не будет знать, какой здесь переход. Чтобы снять эту неоднозначность, принято следующее соглашение: в подобной ситуации ассемблер всегда считает, что Z - метка, и потому всегда формирует команду прямого перехода по этой метке (причем команду длинного перехода). Если же затем обнаружится, что Z - не метка, то будет зафиксирована ошибка.
Так вот, если нас это правило не устраивает, если нам нужен косвенный переход, то мы обязаны сообщить об этом ассемблеру. Для этого используется оператор PTR: вместо просто имени Z надо записать конструкцию WORD PTR Z, которой мы сообщаем ассемблеру, чтобы он рассматривал Z как имя переменной размером в слово, чтобы он формировал машинную команду косвенного перехода.
Итак, при переходах вперед имеем следующие случаи:
JMP Z;goto Z JMP Z;ошибка JMP WORD PRT Z;goto L… … …Z: Z DW L Z DW LДата публикования: 2014-12-08; Прочитано: 829 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!