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



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


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




Содержание раздела