4.10. Команды управления микропроцессором

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

4.10.1. Установка флагов

Есть три команды, которые непосредственно управляют состоянием флага переноса. Команды STC, CLC, CMC соответственно могут устанавлмвать, сбрасывать и изменять флаг переноса. Этот флаг - единственный, которому уделено такое внимание, и в первую очередь, благодаря важности флага переноса при операциях с повышенной точностью. Флаг переноса критичен на промежуточных шагах любых многословных операций. Возможность сбрасывать или устанавливать флаг переноса может помочь при циклической обработке с повышенной точностью. На Фиг. 4.31 показан пример использования команды CLC. Цикл внутри примера складывает отдельные байты двух 10-разрядных упакованных десятичных чисел. Программа выполняет цикл пять раз, так как за каждую итерацию она обрабатывает две цифры. Информация о переносе из одного оборота цикла в другой передается через флаг переноса. Команда CLC сбрасывает флаг переноса перед первым циклом для того, чтобы перед первым сложением не было переноса. Флаг переноса также важен в операциях сдвига, где он становится девятым или семнадцатым битом регистра во время выполнения операции.

Два флага состояния микропроцессора имеют специальные команды работающие с ними. Программа может установить или сбросить маску прерываний соответственно командами STI и CLI. Команда STI включает систему прерываний микропроцессора 8088, позволяя ему реагировать на внешние прерывания. Команда CLI блокирует систему внешних прерываний.


Microsoft (R) Macro Assembler Version 5.00                1/1/80 04:00:49
Фиг. 4.31 Десятичная арифметика повышенной точности             Page  1-1
                         PAGE     ,132
                         TITLE    Фиг. 4.31 Десятичная арифметика повышенной точности
0000                     CODE     SEGMENT
                         ASSUME   CS:CODE, DS:CODE
                         ;----------------------------------------
                         ; Эта программа складывает два десятичных упакованных
                         ; числа (NUMBER_ONE и NUMBER_TWO) и заносит результат
                         ; в NUMBER_TWO.
                         ;----------------------------------------
0000    E3 06                     JCXZ      END_OF_LOOP  ; Конец цикла, если CX равно 0
      = 0005             NUMBER_LENGTH     EQU       5   ; 5 байт для упакованного числа
0000    0005[            NUMBER_ONE        DB        NUMBER_LENGTH DUP (?)
      ??
 0005   0005[            NUMBER_TWO        DB        NUMBER_LENGTH DUP (?)
       ??      ]
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 устанавливает флаг, в результате чего строковые команды уменьшают адресный указатель после каждого выполнения.