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

Оставшиеся команды микропроцессора 8088 управляют его работой.

Многие из них устанавливают или сбрасывают некоторые флаги

состояния.

Есть три команды, которые непосредственно управляют состоянием

флага переноса.Команды STC, CLC, CMC соответственно могут

устанавлмвать, сбрасывать и изменять флаг переноса.Этот флаг -

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

благодаря важности флага переноса при операциях с повышенной

точностью.Флаг переноса критичен на промежуточных шагах любых

многословных операций.Возможность сбрасывать или устанавливать

флаг переноса может помочь при циклической обработке с повышенной

точностью.На Фиг. 4.31 показан пример использования команды CLC.

Цикл внутри примера складывает отдельные байты двух 10-разрядных

упакованных десятичных чисел.Программа выполняет цикл пять раз,

так как за каждую итерацию она обрабатывает две цифры.Информация

о переносе из одного оборота цикла в другой передается через флаг

переноса.Команда CLC сбрасывает флаг переноса перед первым циклом

для того, чтобы перед первым сложением не было переноса.Флаг

переноса также важен в операциях сдвига, где он становится девятым

или семнадцатым битом регистра во время выполнения операции.

 

Два флага состояния микропроцессора имеют специальные команды

работающие с ними. Программа может установить или сбросить маску

прерываний соответственно командами STI и CLI. Команда STI включает

систему прерываний микропроцессора 8088, позволяя ему реагировать

на внешние прерывания. Команда CLI блокирует систему внешних

прерываний.

Microsoft (R) Macro Assembler Version 5.001/1/80 04:02:06

Фиг. 4.31 Десятичная арифметика повышенной точности Page1-1

 

PAGE,132

TITLEФиг. 4.31 Десятичная арифметика повышенной точности

 

0000CODESEGMENT

ASSUMECS:CODE,DS:CODE

 

= 0005NUMBER_LENGTHEQU5; 5 байт для упакованного числа

00000005[NUMBER_ONEDBNUMBER_LENGTH DUP (?)

??

]

00050005[NUMBER_TWODBNUMBER_LENGTH DUP (?)

??

]

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

; Эта программа складывает два десятичных упакованных

; числа (NUMBER_ONE и NUMBER_TWO) и заносит результат

; в NUMBER_TWO.

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

 

000ASTART_ADD:

000AB9 0005MOVCX, NUMBER_LENGTH; Определение длины чисел

 

;-----Установка индексных регистров на младший байт складываемых чисел

 

000D8D 36 0004 RLEASI, NUMBER_ONE + NUMBER_LENGTH - 1

00118D 3E 0009 RLEADI, NUMBER_TWO + NUMBER_LENGTH - 1

 

0015F8CLC; Нет младших разрядов

 

0016ADD_LOOP:

00168A 04MOVAL, [SI]; Взять байт из первого числа

001812 05ADCAL, [DI]; Добавить из второго с учетом переноса

001A27DAA; Коррекция до упакованного формата

001B88 05MOV[DI], AL; Занесение байта результата

001D9CPUSHF; Сохранение флага переноса (CF)

001E4EDECSI ; Сдвиг указателя первого числа

001F4FDECDI ; Сдвиг указателя второго числа

00209DPOPF; Восстановление флагов

0021E2 F3LOOPADD_LOOP; Обработка следующего байта

 

0023CODEENDS

END

 

Фиг. 4.31 Операции с BCD повышенной точности

 

Программа может установить или сбросить флаг направления с

помощью команд STD и CLD. Команда CLD сбрасывает флаг направления,

приводя к тому, что строковые команды ведут обработку при

возрастающих адресах памяти. Команда STD устанавливает флаг, в

результате чего строковые команды уменьшают адресный указатель

после каждого выполнения.


 

Mail.ru