Assembler для начинающих


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



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


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




Содержание раздела