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

2.1. Запишите в текстовом редакторе NORTON программу exdbad.asm в СОМ-формате:

.286

TITLE EXDBAD (COM) Пример сложения двойных слов

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG

ORG 100H ;Начало в конце PSP

BEGIN: JMP SHORT MAIN ;Обход через данные

;-------------------------------------------------------

WORD1A DW 0123H ;Элементы данных

WORD1B DW 0BC62H

WORD2A DW 0012H

WORD2B DW 553AH

WORD3A DW ?

WORD3B 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

CLC ;Очистить флаг переноса

MOV CX,2 ;Установить счетчик

LEA SI,WORD1B ;Левое слово WORD1B

LEA DI,WORD2B ;Левое слово WORD2B

LEA BX,WORD3B ;Левое слово суммы

E20: MOV AX,[SI] ;Поместить слово в АХ

ADC AX,[DI] ;Сложить с переносом

MOV [BX],AX ;Сохранить слово

DEC SI

DEC SI

DEC DI

DEC DI

DEC BX

DEC BX

LOOP E20 ;Повторить цикл

RET

E10DWD ENDP

CODESG ENDS

END BEGIN

Процедура D10DWD демонстрирует простой способ сложения содержимого одной пары слов (WORD1A и WORD1B) с содержимым второй пары слов (WORD2A и WORD2B) и сохранения суммы в третьей паре слов (WORD3A и WORD3B). Сначала выполняется сложение правых слов BC62 и 553A. Полученная сумма превышает емкость регистра АХ. Переполнение вызывает установку влага переноса в 1. Затем выполняется

сложение левых слов, но в данном случае вместо команды ADD используется команда сложения с переносом ADC. Эта команда складывает два значения, и если влаг CF уже установлен, к сумме прибавляется 1.

Процедура E10DWD демонстрирует подход к сложению значений любой длины. Действие начинается со сложения самых правых слов складываемых полей. В первом цикле складываются правые слова, во втором - слова, расположенные левее. При этом адреса в регистрах SI, DI и ВХ уменьшаются на 2. По две команды DEC выполняют эту операцию для каждого регистра. Перед циклом команда CLC устанав-

ливает нулевое значение флага переноса, а также устанавливается счетчик слов.

Для многословного вычитания вместо команды ADC в процедуре E10DWD необходимо установить команду SBB.

2.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG на выполнение программы.

2.3. Просмотреть сегмент кодов с помощью команды D CS:100 и определить в каких ячейках памяти записаны элементы данных программы. Выполнить трассировку программы, записывая выводы в отчет о выполнении каждой команды. При трассировке отслеживать признак переноса CF (если NC - то 0, признака переноса нет, если CY – то 1, признак переноса есть). Для определения результатов выполнения команд: MOV WORD1B,AX и MOV WORD3A,AX необходимо просмотреть сегмент кодов.

Наши рекомендации