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