Cамоучитель по Assembler
Справочная система по языку 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
устанавливает флаг, в
результате чего строковые команды
уменьшают адресный указатель
после каждого выполнения.
Содержание
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий
Справочная система по языку 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 устанавливает флаг, в
результате чего строковые команды уменьшают адресный указатель
после каждого выполнения.
Содержание
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий