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

    Условные переходы делятся на две группы:  проверяющие результаты

    предыдущей арифметической или логической команды, и управляющие

    итерациями фрагмента программы.  Все условные преходы имеют

    однобайтовое смещение.  Если условный переход осуществляется на

    место, находящееся дальше 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.

 

      Если целью является минимизация программ, этого метода нужно

    избегать, так как он превращает команду условного перехода в

    пятибайтовую последовательность. Иногда реорганизация программы

    приводит к тому, что место перехода попадает в нужный диапазон.

    Однако не стоит особенно стараться минимизировать программу. В

    большинстве случаев не имеет особого значения, насколько у

    программы большой объем, лишь бы он не превышал заданного. Это

    имело бы смысл, если бы вы пытались сделать нечто помещающееся в

    модуль ПЗУ постоянного объема, но обычно усилия, затрачиваемые на

    изменения программы, не дают ощутимого выигрыша.