32位乘法组件iApx88

时间:2017-10-07 14:45:03

标签: assembly

我正在尝试进行32位乘法。我无法理解这个问题。答案与计算器不匹配

[org 0x0100]
mov cx,0
mov cx,32
mov dx,[multiplier]
mov bx,[multiplier+2]

check_bit:
shr bx,1
rcr dx,1
jnc skip
mov ax,[multiplicand+6]
add [result+6],ax
mov ax,[multiplicand+4]
adc [result+4],ax
mov ax,[multiplicand+2]
adc [result+2],ax
mov ax,[multiplicand]
adc [result],ax

skip:
shl word[multiplicand+6],1
rcl word[multiplicand+4],1
rcl word[multiplicand+2],1
rcl word[multiplicand],1
dec cl
jnz check_bit

mov ax,0x4c00
int 0x21
multiplicand: dd 0x00000000 , 0x98765432
multiplier: dd 0x12345678
result: dd 0 , 0

1 个答案:

答案 0 :(得分:1)

出现问题是因为您没有按照存储在内存中的方式处理您的号码 你可以为乘数做好,但对于被乘数和结果都没有!

值以 little endian 格式存储在内存中,因此第一次添加是在内存中的最低字上完成的,爬到最高的字:

mov ax,[multiplicand]
add [result],ax
mov ax,[multiplicand+2]
adc [result+2],ax
mov ax,[multiplicand+4]
adc [result+4],ax
mov ax,[multiplicand+6]
adc [result+6],ax

将被乘数加倍也是如此。从低端开始,在每个较高的单词中插入CF:

skip:
    shl word[multiplicand],1
    rcl word[multiplicand+2],1
    rcl word[multiplicand+4],1
    rcl word[multiplicand+6],1
multiplicand: dd 0x00000000 , 0x98765432

这个被乘数很可能不是你想要的? 对于32位乘法,下一步更有意义!

multiplicand: dd 0x98765432 , 0x00000000