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