- •4.13 Особенности арифметических операций c двоичными данными.
- •Многословное сложение
- •Word1a 0123
- •Буззнаковые и знаковые данные
- •Беззнаковое Знаковое
- •4.13.2 Умножение
- •ДоАн alПослеAx
- •Знаковое умножение: команда imul
- •C10mul endp
- •Многословноe умножение
- •Сдвиг влево на 4 бита
- •4.13.3 Деление
- •До ax После ан al
- •Беззнаковое деление: команда div
- •Знаковое деление: команда idiv
- •Переполнения и прерывания
- •Деление вычитанием
- •4.13.4 Преобразование знака
Многословное сложение
Максимально возможное значение в регистре + 32767 ограничивает возможности компьютера для выполнения арифметических операций. Рассмотрим два способа представления арифметических операций. Первый способ более прост, но специфичен, второй— сложнее, но имеет общий характер.
На рис. 4.24 процедура D10DWD демонстрирует простой способ сложения содержимого одной пары слов (WORD1A и WORD1B) с содержимым второй пары слов (WORD2A и WORD2B) и сохранения суммы в третьей паре слов (WORD3A и WORD3B). Сначала выполняется сложение правых слов:
WORD1B ВС62
WORD2B 553А
Сумма: 1119C
Сумма 1119СН превышает емкость регистр AX. Переполнение вызывает установку флага переноса в 1. Затем выполняется сложение левых слов, но в данном случае вместо команды ADD используется команда сложения с переносом ADC (ADd with Carry). Эта команда складывает два значения, и если флаг CF уже установлен, к сумме прибавляется 1:
Word1a 0123
WORD2A 0012
Плюс перенос 1
Сумма: 0136
.CODESG SEGMENT PARA 'Code'
ASSUME CS:COOESG,DS:COOESG,SS:CODESG
ORG 100H
BEGIN: JMP SHORT MAIN
WORD1A DW 0123Н ;Элементы данных
WORD1B DW BC62H
WORDRSV1 DW 8 DUP (?)
WORD2A DW 0012H
WORD2B DW 553AH
WORDRSV2 DW 8 DUP (?)
WORDRSV3 DW 10 DUP (?)
WORD3A DW EQU WORDRSV3
WORD3B DW EQU WORDRSV3+4
NUMBER DW ?
MAIN PROC NEAR ;Основная процедура:
CALL D10DWD ;Вызвать сложение 1
CALL E10DWD ;Вызвать сложение 2
RET
MAIN ENDP
; Пример сложения двойных слов:
D10DWD PROC
MOV AX, WORD1B ;Сложить правые слова
ADD AX, WORD2B
MOV WORD3B,AX
MOV AX,WORD1A ;Сложить левые слова
ADC AX,WORD2A ;с переносом
MOV WORD3A, AX
RET
D10DWD ENDP
; Сложение чисел любой длины:
E10DWD PROC FAR
PUSH FX ;Сохранение регистра Флагов
PUSHAD ;Сохранить все регистры
CLC ;Очистить Флаг переноса
MOV ECX,NUMBER ;Установить счетчик
LEA SI, WORD1A ;Старшее слово числа DWORD1
LEA DI,WORD2A ;Старшее слово числа DWORD2
LEA BX,WORD3A ; Старшее слово числа суммы
Е20:
MOV AX,[SI+ECX] ;Поместить слово в AX
ADC AX,[DI+ECX] ;Сложить с переносом
MOV [BX+ECX],AX ;Сохранить слово
DEC SI
DEC SI
DEC DI
DEC DI
DEC BX
DEC BX
LOOP Е20 ; Повторить цикл
POPAD
POP FX
RET
E10DWD ENDP
CODESG ENDS
END BEGIN
Рис. 4.24. Сложение двойных слов и слов любой длины
На рис.4.24 процедура E10DWD демонстрирует подход к сложению значений любой длины. Действие начинается со сложения самых правых слов складываемых полей. В первом цикле складываются правые слова, во втором - слова, расположенные левее и т.д. При этом адреса в регистрах SI, DI и BX уменьшаются на 2. По две команды DEC выполняют эту операцию для каждого регистра. Применять команду
SUB reg,02
в данном случае нельзя, так как при этом будет очищен флаг переноса, что приведет к искажению результата сложения.
Ввиду наличия цикла используется только одна команда сложения ADC. Перед циклом команда CLC (CLear Carry -очистить флаг переноса) устанавливает нулевое значение флага переноса. Для работы данного метода необходимо: 1) обеспечить смежность слов, 2) выполнять обработку справа налево и 3) загрузить в регистр CX число складываемых слов.
Для многословного вычитания используется команда SBB (SuBtract with Borrow - вычитание с заемом), эквивалентная команде ADC. Заменив в процедуре E10DWD (рис. 12.2) команду ADC на SBB, получим процедуру для вычитания.