+ -
当前位置:首页 → 问答吧 → 新手求助~!32位符号数的乘法运算,求注释!谢谢

新手求助~!32位符号数的乘法运算,求注释!谢谢

时间:2010-12-14

来源:互联网

;32位符号数的乘法运算 
;入: DXAX=32位操作数1 
; CXBX=32位操作数2 
;出: CXBXDXAX=两操作数积 
;=============================== 
subn_mul32 proc near 
push di 
xor di,di 
test dh,80h 
jz sss_1 
mov di,1 
not dx 
not ax 
add ax,1 
adc dx,0 
sss_1: 
test ch,80h 
jz sss_2 
not cx 
not bx 
add bx,1 
adc cx,0 
xor di,1 
sss_2: 
call subn_32x32 
test di,1 
jz sss_out 
not ax 
not bx 
not cx 
not dx 
add ax,1 
adc dx,0 
adc bx,0 
adc cx,0 
sss_out: 
pop di 
ret 
subn_mul32 endp 


作者: z307450494   发布时间: 2010-12-14

帮帮我~谁懂?

作者: z307450494   发布时间: 2010-12-15

subn_mul32 proc near  
push di  
xor di,di ;di用来记乘积的符号,初始状态置为0,表示+
test dh,80h ;判断32位操作数DX AX是正数还是负数,只需看最高位是0还是1
jz sss_1 ;若是正数,转到sss_1
mov di,1 ;若是负数,则DI置1,表示乘积可能为负(还要看另一个操作数)
not dx ;以下4行取32位操作数DX AX的相反数(即绝对值),就是用“取反+1”的操作
not ax  
add ax,1  
adc dx,0  
sss_1:  
test ch,80h ;这里到sss_2是对另一个操作数CX BX做同样的处理
jz sss_2  
not cx  
not bx  
add bx,1  
adc cx,0  
xor di,1 ;第二个操作数为负数,则di最低位取反(即,0变成1,或1变成0)
sss_2:  
call subn_32x32 ;这个子程序应该是完成无符号32位数乘法的,用它求原两个数绝对值的成绩
test di,1 ;判断乘积的符号应该是正还是负
jz sss_out ;应该是正,则结束
not ax ;否则,以下8行用“取反加一”的操作,对CX BX DX AX这个64位数取相反数
not bx  
not cx  
not dx  
add ax,1  
adc dx,0  
adc bx,0  
adc cx,0  
sss_out:  
pop di  
ret  
subn_mul32 endp

作者: shzhfu   发布时间: 2010-12-15