Многословное сложение
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 необходимо просмотреть сегмент кодов.