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


          

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


то он генерирует двухбайтовую команду. Если ассемблер еще не вычислил значение операнда (при переходе вперед)

JMP A90 ... A90:

то он не знает тип перехода NEAR или FAR, и автоматически генерирует 3-х байтовую команду. Для того, чтобы указать ассемблеру на необходимость генерации двухбайтовой команды, следует использовать оператор SHORT:

JMP SHORT A90 ... A90:

В качестве полезного упражнения, введите программу, проассемблируйте ее, скомпануйте и переведите в COM-формат. Определение данных не требуется, поскольку непосредственные операнды генерируют все необходимые данные. Используйте отладчик DEBUG для пошагового выполнения COM-модуля и просмотрите несколько повторений цикла. Когда регистр AX будет содержать 08, BX и CX увеличатся до шест. 24 (дес. 36) и шест. 80 (дес. 128), соответственно. Для выхода из отладчика используйте команду Q.

КОМАНДА LOOP ------------------------------------------------------------

Команда JMP в примере на рис. 7.1 реализует бесконечный цикл. Но более вероятно подпрограмма должна выполнять определенное число циклов. Команда LOOP, которая служит для этой цели, использует начальное значение в регистре CX. В каждом цикле команда LOOP автоматически уменьшает содержимое

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

регистра CX на 1. Пока значение в CX не равно нулю, управление передается по адресу, указанному в операнде, и если в CX будет 0, управление переходит на слудующую после LOOP команду. Программа на рис. 7.2, иллюстрирующая использование коман ды LOOP, выполняет действия, аналогичные примеру на рис. 7.1 за исключением того, что после десяти циклов программа завершается. Команда MOV инициализирует регистр CX значением 10. Так как команда LOOP использует регистр CX, то в программе для удвоения начального значения 1 вместо регистра CX используется DX. Команда JMP A20 заменена командой LOOP и для эффективности команда ADD AX,01 заменена командой INC AX (увеличение AX на 1). Аналогично команде JMP, операнд команды LOOP определяет расстояние от конца команды LOOP до адреса метки A20, кото рое прибавляется к содержимому командного указателя. Для команды LOOP это расстояние должно быть в пределах от -128 до +127 байт. Если операнд превышает эти границы, то ассемб лер выдаст сообщение "Relative jump out of range" (превышены границы перехода). Для проверки команды LOOP рекомендуется изменить соответствующим образом программу, приведенную на рис.7.1, выполнить ее ассемблирование, компановку и преобразование в COM-файл. Для трассировки всех десяти циклов используйте отладчик DEBUG. Когда в значение регистре CX уменьшится до нуля, содержимое регистpов AX, BX и DX будет соответственно шест. 000B, 0042 и 0400. Для выхода из отладчика введите команду Q. Дополнительно существует две разновидности команды LOOP - это LOOPE (или LOOPZ) и LOOPNE (или LOOPNZ). Обе команды также уменьшают значение регистра CX на 1. Команда LOOPE передает управление по адресу операнда, если регистр CX имеет ненулевое значение и флаг нуля установлен (ZF=1). Команда LOOPNE передает управление по адресу операнда, если регистр CX имеет ненулевое значение и флаг нуля сброшен (ZF=0).




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