На главную Назад
Добро пожаловать, уважаемый посетитель!

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

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

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

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

место, находящееся дальше 128 байт, нужно использовать специальную

конструкцию.Например, допустим, что программе надо перейти к

метке ZERO, если установлен флаг нуля; эта метка находится дальше

128 байт от текущего места.Программа в этом случае выглядит

примерно так:

JNZCONTINUE

JMPZERO

CONTINUE:

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

Фиг. 4.28 Таблица переходов Page1-1

 

 

PAGE,132

TITLEФиг. 4.28 Таблица переходов

 

0000CODESEGMENT

ASSUMECS:CODE

 

;----------------------------------------

; В этом примере демонстрируется программа,

; осуществляющая переход в зависимости от

; значения регистра AL. В регистре находится

; индекс в таблице переходов необходимой программы

;----------------------------------------

 

00002A FFSUBBH, BH; BH <- 0

00028A D8MOVBL, AL; Индекс загружается в регистр BL

0004D1 E3SHLBX, 1; * 2 для получения смещения

00062E: FF A7 000B RJMPCS:[BX + BRANCH_TABLE]; Косвенный близкий переход

 

000BBRANCH_TABLELABELWORD

000B0011 RDWROUTINE_ONE

000D0011 RDWROUTINE_TWO

000F0011 RDWROUTINE_THREE

; ...

 

0011ROUTINE_ONELABELNEAR

0011ROUTINE_TWOLABELNEAR

0011ROUTINE_THREELABELNEAR

 

0011CODEENDS

END

 

Фиг. 4.28 Таблица переходов

 

Здесь используется условный переход с противоположным условием.

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

которая может использовать смещение вплоть до 32768 байт, а в

условном переходе используется метка CONTINUE.

 

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

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

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

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

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

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

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

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

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

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


 

Mail.ru