Многословное умножение
5.1. Запишите в текстовом редакторе NORTON программу exmult2.asm в СОМ-формате:
.286
TITLE EXMULT2 (COM) Пример команд умножения
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H ;Начало в конце PSP
BEGIN: JMP SHORT MAIN ;Обход через данные
;-------------------------------------------------------
MULTCND DW 3206H ;Элементы данных
DW 2521H
MULTPLR DW 6400H
DW 0A26H
PRODUCT DW 0
DW 0
DW 0
DW 0
;--------------------------------------------------------
MAIN PROC NEAR ;Основная процедура
CALL E10XMUL ;Вызвать 1 4-е 0 умножение
CALL Z10ZERO ;Очистить произведение
CALL F10XMUL ;Вызвать 2 4-е 0 умножение
RET
MAIN ENDP
; Умножение дв. слова на слово
; ----------------------------
E10XMUL PROC
MOV AX,MULTCND+2 ;Умнож. прав. сл.
MUL MULTPLR ;множимого
MOV PRODUCT+4,AX ;Записать произв.
MOV PRODUCT+2,DX
MOV AX,MULTCND ;Умножить лев. сл.
MUL MULTPLR ;множимого
ADD PRODUCT+2,AX ;Сложить с полученным ранее
ADC PRODUCT,DX
RET
E10XMUL ENDP
; Перемножение двух двойных слов
; ------------------------------
F10XMUL PROC
MOV AX,MULTCND+2 ;Слово-2 множимого
MUL MULTPLR ;* слово-2 множителя
MOV PRODUCT+6,AX ;Сохранить рез.
MOV PRODUCT+4,DX
MOV AX,MULTCND+2 ;Слово-2 множимого
MUL MULTPLR ;* слово-1 множителя
ADD PRODUCT+4,AX ;Сложить с пред.
ADC PRODUCT+2,DX
ADC PRODUCT,00 ;Прибавить перенос
MOV AX,MULTCND ;Слово-1 множимого
MUL MULTPLR+2 ;* слово-2 множителя
ADD PRODUCT+4,AX ;Сложить с пред.
ADC PRODUCT+2,DX
ADC PRODUCT,00 ;Прибавить перенос
MOV AX,MULTCND ;Слово-1 множимого
MUL MULTPLR ;* слово-1 множителя
ADD PRODUCT+2,AX ;Сложить с пред.
ADC PRODUCT,DX
RET
F10XMUL ENDP
; Очистка области результата
; --------------------------
Z10ZERO PROC
MOV PRODUCT,0000
MOV PRODUCT+2,0000
MOV PRODUCT+4,0000
MOV PRODUCT+6,0000
RET
Z10ZERO ENDP
CODESG ENDS
END BEGIN
Процедура E10XMUL умножает двойное слово на слово. Множимое MULTCND состоит из двух слов, содержащих соответственно 3206Н и 2521Н. Определение данных в виде двух слов (DW) вместо двойного слова (DD) обусловлено необходимостью правильной адресации для команд MOV, пересылающих слова в регистр АХ. Множитель MULTPLR содержит 6400Н. Область для записи произведения PRODUCT состоит из трех слов. Первая команда MUL перемножает MULTPLR и правое слово поля MULTCND; произведение 0Е80 Е400 записывается в PRODUCT+2 и PRODUCT+4. Вторая команда MUL перемножает MULTPLR и левое слово поля MULTCND, получая в результате 138А 5800. Далее выполняется сложение двух произведений следующим образом:
PRODUCT PRODUCT+2 PRODUCT+4
Произведение 1: 0000 0E80 E400
DX AX
Произведение 2: 138A 5800
-----------------------------
PRODUCT PRODUCT+2 PRODUCT+4
Результат: 138A 6680 E400
Так как первая команда ADD может выработать перенос, то второе сложение выполняется командой сложения с переносом ADC. Если команда ADD не дала перенос, то команда ADC выполняется также как и ADD. Если команда ADD дала перенос, то команда ADC выполняет сложение и прибавляет к полученной сумме 1.
Умножение двух двойных слов в процедуре F10XMUL включает следующие четыре операции умножения: