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

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 включает следующие четыре операции умножения: