Ассемблер и программирование для IBM PC


          

ГЛАВА 7. Логика и Организация Программы - часть 2


В COM-программе на рис. 7.1 используется команда JMP. В pегистры 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: - двоетичие oбозначает, что метка находится внутри процедуры (в данном случае BEGIN) в сегменте кода. В конце цикла находится команда

JMP A20

которая указывает на то, что управление должно быть передано команде c меткой A20. Обратите внимание, что адресная метка в операнде команды указывается без двоеточия. Данный цикл не имеет выхода и приводит к бесконечному выполнению - такие циклы обычно не используются.

------------------------------------------------------------ ------------------------------------------------------------ Рис.7.1. Использование команды JMP.

Метку можно кодировать на одной строке с командой:

A20: ADD AX,01

или на отдельной строке:

A20: ADD AX,01

В обоих случаях адрес A20 указывает на первый байт команды ADD. Двоеточие в метке A20 указывает на тип метки - NEAR. Запомните: отсутствие двоеточия в метке является частой ошибкой. В нашем примере A20 соответствует -9 байтам от команды JMP, в чем можно убедиться по объектному коду команды - EBF7. EB представляет собой машинный код для короткого перехода JMP, а F7 - отрицательное значение смещения (-9). Команда JMP прибавляет F7 к командному указателю (IP), котоpый содержит адрес команды после JMP (0112):

Дес. Шест. Командный указатель: 274 112 Адрес в команде JMP: -9 F7 (двоичное дополнение) Адрес перехода: 265 109

Ассемблер для IBM PC. Глава 7 134

В результате сложения получается адрес перехода - шест. 109. Проверьте по листингу программы, что относительный адрес метки действительно соответствует шест.109. Соответственно операнд в команде JMP для перехода вперед имеет положитель ное значение. Команда JMP для перехода в пределах -128 до +127 байт имеет тип SHORT. Ассемблер генерирует в этом случае однобайтовый операнд в пределах от 00 до FF. Команда JMP, превосходящая эти пределы, получает тип FAR, для которого генерируется другой машинный код и двухбайтовый операнд. Ассемблер в первом просмотре исходной программы определяет длину каждой команды. Однако, команда JMP может быть длиной два или три байта. Если к моменту просмотра команды JMP ассемблер уже вычислил значение опеpанда (при переходе назад): A50: ... JMP A50




Содержание  Назад  Вперед