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

      JNZ   CONTINUE

      JMP   ZERO

       CONTINUE:

          Microsoft (R) Macro Assembler Version 5.00              1/1/80 04:01:56

          Фиг. 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.

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