Логика и организация программы
Некоторые команды могут передавать управление, изменяя нормальную
последовательность шагов непосредственной модификацией значения смещения в
командном указателе. Ниже приведены четыре способа передачи управления
(все будут рассмотрены в этой главе):
Безусловный переход: JMP
Цикл: LOOP
Условный переход: Jnnn (больше,меньше,равно)
Вызов процедуры: CALL
Заметим, что имеется три типа адресов: SHORT, NEAR и FAR. Адресация
SHORT используется при циклах, условных пеpеходах и некоторых безусловных
переходах. Адресация NEAR и FAR используется для вызовов процедур (CALL) и
безусловных переходов, которые не квалифицируются , как SHORT. Все три
типа передачи управления воздействуют на содержимое регистра IP; тип FAR
также изменяет регистр CS.
Одной из команд обычно используемых для передачи управления является
команда JMP. Эта команда выполняет безусловный переход, т.е. обеспечивает
передачу управления при любых обстоятельствах.
. Команда LOOP, которая служит для этой цели, использует начальное значение в
регистре CX. В каждом цикле команда LOOP автоматически уменьшает
содержимое регистра CX на 1. Пока значение в CX не равно нулю, управление
передается по адресу, указанному в операнде, и если в CX будет 0,
управление переходит на следующую после LOOP команду. Дополнительно существует две разновидности команды LOOP - это LOOPE
(или LOOPZ) и LOOPNE (или LOOPNZ). Обе команды также уменьшают значение
регистра CX на 1. Команда LOOPE передает управление по адресу операнда,
если регистр CX имеет ненулевое значение и флаг нуля установлен (ZF=1).
Команда LOOPNE передает управление по адресу операнда, если регистр CX
имеет ненулевое значение и флаг нуля сброшен (ZF=0).
Флаговый регистр
Флаговый pегистр содержит 16 бит флагов, которые
управляются различными командами для индикации состояния операции. Во всех
случаях флаги сохраняют свое значение до тех пор, пока другая команда не
изменит его. Флаговый регистр содержит девять используемых бит.
Номер бита: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Флаг: * * * * O D I T S Z * A * P * C
Рассмотрим эти флаги в последовательности справа налево.
CF (Carry Flag) - флаг переноса. Содержит значение "переносов" (0 или
1) из старшего разряда при арифметических операциях и некоторых операциях
сдвига и циклического сдвига (см. гл.12).
PF (Parity Flag) - флаг четности. Проверяет младшие восемь бит
pезультатов операций над данными. Нечетное число бит приводит к установке
этого флага в 0, а четное - в 1. Не следует путать флаг четности с битом
контроля на четность.
AF (Auxiliary Carry Flag) - дополнительный флаг переноса.
Устанавливается в 1, если арифметическая операция приводит к переносу
четвертого справа бита (бит номер 3) в регистровой однобайтовой команде.
Данный флаг имеет отношение к арифметическим операциям над символами кода
ASCII и к десятичным упакованным полям.
ZF (Zero Flag) - флаг нуля. Устанавливается в качестве результата
aрифметических команд и команд сравнения. Как это ни странно, ненулевой
результат приводит к установке нулевого значения этого флага, а нулевой -
к установке единичного значения. Кажущееся несоответствие является,
однако, логически правильным, так как 0 обозначает "нет" (т.е. результат
не равен нулю), а единица обозначаeт "да" (т.е. результат равен нулю).
Команды условного перехода JE и JZ проверяют этот флаг.
SF (SIgn Flag) - знаковый флаг. Устанавливается в соответствии со
знаком результата (старшего бита) после арифметических опеpаций:
положительный результат устанавливает 0, а отрицательный - 1. Команды
условного перехода JG и JL проверяют этот флаг.
TF (Trap Flag) - флаг пошагового выполнения. Этот флаг вам уже
приходилось устанавливать, когда использовалась команда Т в отладчике
DEBUG. Если этот флаг установлен в единичное cостояние, то процессор
переходит в режим пошагового выполнения команд, т.е. в каждый момент
выполняется одна команда под пользовательским управлением.
IF (Interrupt Flag) - флаг прерывания. При нулевом состоянии этого
флага прерывания запрещены, при единичном - разрешены.
DF (DIrection Flag) - флаг направления. Используется в строковых
операциях для определения направления передачи данных. При нулевом
состоянии команда увеличивает содержимое регистров SI и DI, вызывая
передачу данных слева направо, при нулевом - уменьшает содержимое этих
регистров, вызывая передачу данных справа налево (см. гл.11).
OF (Overflow Flag) - флаг переполнения. Фиксирует арифметическое
переполнение, т.е. перенос вниз старшего (знакового) бита при знаковых
арифметических операциях.
Поиск по сайту:
|