|
Условные переходы делятся на две
группы:проверяющие результаты
предыдущей арифметической или логической
команды, и управляющие
итерациями фрагмента программы.Все условные преходы имеют
однобайтовое смещение.Если условный переход осуществляется на
место, находящееся дальше 128 байт, нужно
использовать специальную
конструкцию.Например, допустим, что программе надо перейти к
метке ZERO, если установлен флаг нуля; эта
метка находится дальше
128 байт от текущего места.Программа в этом случае выглядит
примерно так:
JNZCONTINUE
JMPZERO
CONTINUE:
Microsoft (R) Macro Assembler Version 5.001/1/80 04:01:56
Фиг. 4.28 Таблица переходов
Page1-1
PAGE,132
TITLEФиг. 4.28 Таблица переходов
0000CODESEGMENT
ASSUMECS:CODE
;----------------------------------------
; В этом примере демонстрируется программа,
; осуществляющая переход в зависимости от
; значения регистра AL. В регистре
находится
; индекс в таблице переходов необходимой
программы
;----------------------------------------
00002A FFSUBBH, BH; BH <- 0
00028A D8MOVBL, AL; Индекс загружается в регистр BL
0004D1 E3SHLBX, 1; * 2 для получения смещения
00062E: FF A7 000B RJMPCS:[BX + BRANCH_TABLE]; Косвенный близкий переход
000BBRANCH_TABLELABELWORD
000B0011 RDWROUTINE_ONE
000D0011 RDWROUTINE_TWO
000F0011 RDWROUTINE_THREE
; ...
0011ROUTINE_ONELABELNEAR
0011ROUTINE_TWOLABELNEAR
0011ROUTINE_THREELABELNEAR
0011CODEENDS
END
Фиг. 4.28 Таблица переходов
Здесь используется условный переход с
противоположным условием.
На метку ZERO управление передает команда
безусловного перехода,
которая может использовать смещение вплоть
до 32768 байт, а в
условном переходе используется метка
CONTINUE.
Если целью является минимизация программ,
этого метода нужно
избегать, так как он превращает команду
условного перехода в
пятибайтовую последовательность. Иногда
реорганизация программы
приводит к тому, что место перехода
попадает в нужный диапазон.
Однако не стоит особенно стараться
минимизировать программу. В
большинстве случаев не имеет особого
значения, насколько у
программы большой объем, лишь бы он не
превышал заданного. Это
имело бы смысл, если бы вы пытались
сделать нечто помещающееся в
модуль ПЗУ постоянного объема, но обычно
усилия, затрачиваемые на
изменения программы, не дают ощутимого
выигрыша.
|