Assembler для начинающих

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


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



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