4.9.4. Переходы по условию

Условные переходы делятся на две группы: проверяющие результаты предыдущей арифметической или логической команды, и управляющие итерациями фрагмента программы. Все условные преходы имеют однобайтовое смещение. Если условный переход осуществляется на место, находящееся дальше 128 байт, нужно использовать специальную конструкцию. Например, допустим, что программе надо перейти к метке ZERO, если установлен флаг нуля; эта метка находится дальше 128 байт от текущего места. Программа в этом случае выглядит примерно так:


          JNZ    CONTINUE
          JMP     ZERO
CONTINUE:


Microsoft (R) Macro Assembler Version 5.00                1/1/80 04:00:49
Фиг. 4.28 Таблица переходов                                     Page  1-1
                         PAGE     ,132
                         TITLE    Фиг. 4.28 Таблица переходов
0000                     CODE     SEGMENT
                         ASSUME   CS:CODE
                         ;----------------------------------------
                         ; В этом примере демонстрируется программа,
                         ; осуществляющая переход в зависимости от
                         ; значения регистра AL. В регистре находится
                         ; индекс в таблице переходов необходимой программы
                         ;----------------------------------------
0000    2A FF                      SUB       BH, BH       ; BH <- 0
0002    8A D8                      MOV       BL, AL       ; Индекс загружается в регистр BL
0004    D1 E3                      SHL       BX, 1        ; * 2 для получения смещения
0006    2E: FF A7 000B R           JMP       CS:[BX + BRANCH_TABLE] ; Косвенный близкий переход
000B                     BRANCH_TABLE  LABEL     WORD
000B    0011 R                     DW        ROUTINE_ONE
000D    0011 R                     DW        ROUTINE_TWO
000F    0011 R                     DW        ROUTINE_THREE
                         ; ...
0011                     ROUTINE_ONE       LABEL     NEAR
0011                     ROUTINE_TWO       LABEL     NEAR
0011                     ROUTINE_THREE     LABEL     NEAR
0011                     CODE      ENDS
                         END

                                  Фиг. 4.28 Таблица переходов

Здесь используется условный переход с противоположным условием. На метку ZERO управление передает команда безусловного перехода, которая может использовать смещение вплоть до 32768 байт, а в условном переходе используется метка CONTINUE.

Если целью является минимизация программ, этого метода нужно избегать, так как он превращает команду условного перехода в пятибайтовую последовательность. Иногда реорганизация программы приводит к тому, что место перехода попадает в нужный диапазон. Однако не стоит особенно стараться минимизировать программу. В большинстве случаев не имеет особого значения, насколько упрограммы большой объем, лишь бы он не превышал заданного. Это имело бы смысл, если бы вы пытались сделать нечто помещающееся в модуль ПЗУ постоянного объема, но обычно усилия, затрачиваемые на изменения программы, не дают ощутимого выигрыша.