【任务】用十六位乘法指令完成三十二位无符号数乘法(结果64位),数据用下面的内存单元提供:
ddata segment
x1 dw 5678H
x2 dw 1234H
y1 dw 0DEF0H
y2 dw 9ABCH
xy dw 4 dup (?)
ddata ends
其中,被乘数x=((x2)*2^16)+(x1),即x2是高16位,x1是低16位;乘数y=((y2)*2^16)+(y1),即y2是高16位,y1是低16位。
【分析】
将把32位的被乘数的乘法分别分割成2个16位的数,分别对其进行16位的乘法,然后将得到的4个16位乘法的乘积,按照各自的位相加的最终乘积,如下图:
【参考解答】
assume cs:ccode, ds:ddata
ddata segment
x1 dw 5678H
x2 dw 1234H
y1 dw 0DEF0H
y2 dw 9ABCH
xy dw 4 dup (?)
ddata ends
ccode segment
start:mov ax,ddata
mov ds,ax
mov ax,x1
mov dx,y1
mul dx
mov [xy],ax
mov [xy+2],dx ;被乘数低位4字符x1和乘数低位4字符y1相乘结果低位存入xy,高位存入xy+2
mov ax,x2
mov dx,y1
mul dx
add [xy+2],ax
adc [xy+4],dx ; 被乘数高位4字符x2和乘数低位4字符y1相乘结果低位存入xy+2,高位存入xy+4
mov ax,x1
mov dx,y2
mul dx
add [xy+2],ax
adc [xy+4],dx
adc [xy+6],0 ; 被乘数低位4个字符x1和乘数高位4个字符y2相乘结果低位存入xy+2,高位存入xy+4
mov ax,x2
mov dx,y2
mul dx
add [xy+4],ax
adc [xy+6],dx ; 被乘数高位4个字符x2和乘数高位4个字符y2相乘结果低位存入xy+4,高位存入xy+6
mov ah,4ch
int 21h
ccode ends
end start