Установка флагов
Установка флагов
Есть три команды, которые непосредственно управляют состоянием
флага переноса. Команды STC, CLC, CMC соответственно могут
устанавлмвать, сбрасывать и изменять флаг переноса. Этот флаг -
единственный, которому уделено такое внимание, и в первую очередь,
благодаря важности флага переноса при операциях с повышенной
точностью. Флаг переноса критичен на промежуточных шагах любых
многословных операций. Возможность сбрасывать или устанавливать
флаг переноса может помочь при циклической обработке с повышенной
точностью. На Фиг. 4.31 показан пример использования команды CLC.
Цикл внутри примера складывает отдельные байты двух 10-разрядных
упакованных десятичных чисел. Программа выполняет цикл пять раз,
так как за каждую итерацию она обрабатывает две цифры. Информация
о переносе из одного оборота цикла в другой передается через флаг
переноса. Команда CLC сбрасывает флаг переноса перед первым циклом
для того, чтобы перед первым сложением не было переноса. Флаг
переноса также важен в операциях сдвига, где он становится девятым
или семнадцатым битом регистра во время выполнения операции.
Два флага состояния микропроцессора имеют специальные команды
работающие с ними. Программа может установить или сбросить маску
прерываний соответственно командами STI и CLI. Команда STI включает
систему прерываний микропроцессора 8088, позволяя ему реагировать
на внешние прерывания. Команда CLI блокирует систему внешних
прерываний.
Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:02:06
Фиг. 4.31 Десятичная арифметика повышенной точности Page 1-1
PAGE ,132
TITLE Фиг. 4.31 Десятичная арифметика повышенной точности
0000 CODE SEGMENT
ASSUME CS:CODE,DS:CODE
= 0005 NUMBER_LENGTH EQU 5 ; 5 байт для упакованного числа
0000 0005[ NUMBER_ONE DB NUMBER_LENGTH DUP (?)
??
]
0005 0005[ NUMBER_TWO DB NUMBER_LENGTH DUP (?)
??
]
;----------------------------------------
; Эта программа складывает два десятичных упакованных
; числа (NUMBER_ONE и NUMBER_TWO) и заносит результат
; в NUMBER_TWO.
;----------------------------------------
000A START_ADD:
000A B9 0005 MOV CX, NUMBER_LENGTH ; Определение длины чисел
;----- Установка индексных регистров на младший байт складываемых чисел
000D 8D 36 0004 R LEA SI, NUMBER_ONE + NUMBER_LENGTH - 1
0011 8D 3E 0009 R LEA DI, NUMBER_TWO + NUMBER_LENGTH - 1
0015 F8 CLC ; Нет младших разрядов
0016 ADD_LOOP:
0016 8A 04 MOV AL, [SI] ; Взять байт из первого числа
0018 12 05 ADC AL, [DI] ; Добавить из второго с учетом переноса
001A 27 DAA ; Коррекция до упакованного формата
001B 88 05 MOV [DI], AL ; Занесение байта результата
001D 9C PUSHF ; Сохранение флага переноса (CF)
001E 4E DEC SI ; Сдвиг указателя первого числа
001F 4F DEC DI ; Сдвиг указателя второго числа
0020 9D POPF ; Восстановление флагов
0021 E2 F3 LOOP ADD_LOOP ; Обработка следующего байта
0023 CODE ENDS
END
Фиг. 4.31 Операции с BCD повышенной точности
Программа может установить или сбросить флаг направления с
помощью команд STD и CLD. Команда CLD сбрасывает флаг направления,
приводя к тому, что строковые команды ведут обработку при
возрастающих адресах памяти. Команда STD устанавливает флаг, в
результате чего строковые команды уменьшают адресный указатель
после каждого выполнения.