程序集 8088:使用 16 位寄存器进行加法和位操作的 32 位带符号乘法
Assembly 8088: 32-bit signed Multiplication with addition and bit manipulation using 16-bit registers
我正在尝试编写汇编程序来将两个 32 位有符号数相乘并将答案存储在 64 位数字中,但我的代码只给出最多 32 位的正确答案。我已经目视它并搜索了很多网站但不能让自己满意。尽管我调试了很多次,但我无法解决问题 times.This 是我作为学生的第一个问题,所以如果我是 unclear.Thanks :)
,我真的很抱歉
; 32bit multiplication
[org 0x0100]
multiplicand dd 0,9000008 ; 32bit multiplicand 64bit space
multiplier: dd 45009 ; 32bit multiplier
result: dd 0,0 ; 64bit result
start:
mov cx,32 ; initialize bit count to 32
mov bx, [multiplier] ; load multiplier in dx and bx
mov dx, [multiplier+2]
checkbit:
sar dx,1 ; move right most bit in carry
rcr bx,1
jnc skip ; skip addition if bit is zero
mov ax,[multiplicand]
add word[result],ax
mov ax,[multiplicand+2]
adc word[result+2],ax
mov ax,[multiplicand+4]
adc word[result+4],ax
mov ax,[multiplicand+6]
adc word[result+6],ax
mov ax,[multiplicand+8]
adc word[result+8],ax
mov ax,[multiplicand+10]
adc word[result+10],ax
mov ax,[multiplicand+12]
adc word[result+12],ax
mov ax,[multiplicand+14]
adc word[result+14],ax
skip:
shl word [multiplicand],1
rcl word [multiplicand+2],1
rcl word [multiplicand+4],1
rcl word [multiplicand+6],1
rcl word [multiplicand+8],1
rcl word [multiplicand+10],1
rcl word [multiplicand+12],1
rcl word [multiplicand+14],1
dec cx
jnz checkbit
mov ax,0x4c00 ; terminate program
int 0x21
我认为我的逻辑是正确的,但我无法理解错误是什么。任何帮助表示赞赏。 :)
multiplicand dd 0,9000008 ; 32bit multiplicand 64bit space
您设置了 64 位 space 但您的代码修改了 128 位 space!!
另外,由于字节顺序很小,您应该交换被乘数的双字。
我正在尝试编写汇编程序来将两个 32 位有符号数相乘并将答案存储在 64 位数字中,但我的代码只给出最多 32 位的正确答案。我已经目视它并搜索了很多网站但不能让自己满意。尽管我调试了很多次,但我无法解决问题 times.This 是我作为学生的第一个问题,所以如果我是 unclear.Thanks :)
,我真的很抱歉; 32bit multiplication
[org 0x0100]
multiplicand dd 0,9000008 ; 32bit multiplicand 64bit space
multiplier: dd 45009 ; 32bit multiplier
result: dd 0,0 ; 64bit result
start:
mov cx,32 ; initialize bit count to 32
mov bx, [multiplier] ; load multiplier in dx and bx
mov dx, [multiplier+2]
checkbit:
sar dx,1 ; move right most bit in carry
rcr bx,1
jnc skip ; skip addition if bit is zero
mov ax,[multiplicand]
add word[result],ax
mov ax,[multiplicand+2]
adc word[result+2],ax
mov ax,[multiplicand+4]
adc word[result+4],ax
mov ax,[multiplicand+6]
adc word[result+6],ax
mov ax,[multiplicand+8]
adc word[result+8],ax
mov ax,[multiplicand+10]
adc word[result+10],ax
mov ax,[multiplicand+12]
adc word[result+12],ax
mov ax,[multiplicand+14]
adc word[result+14],ax
skip:
shl word [multiplicand],1
rcl word [multiplicand+2],1
rcl word [multiplicand+4],1
rcl word [multiplicand+6],1
rcl word [multiplicand+8],1
rcl word [multiplicand+10],1
rcl word [multiplicand+12],1
rcl word [multiplicand+14],1
dec cx
jnz checkbit
mov ax,0x4c00 ; terminate program
int 0x21
我认为我的逻辑是正确的,但我无法理解错误是什么。任何帮助表示赞赏。 :)
multiplicand dd 0,9000008 ; 32bit multiplicand 64bit space
您设置了 64 位 space 但您的代码修改了 128 位 space!!
另外,由于字节顺序很小,您应该交换被乘数的双字。