Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архитектура компьютеров / 6_Доп программы.doc
Скачиваний:
44
Добавлен:
20.03.2015
Размер:
164.35 Кб
Скачать

Многословное сложение

Максимально возможное значение в регистре + 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, получим процедуру для вычитания.

Соседние файлы в папке Архитектура компьютеров