汇编8088:32位带符号乘法,使用16位寄存器进行加法和位操作

时间:2015-01-18 15:40:42

标签: assembly 32-bit computer-architecture x86-16

我正在尝试编写汇编程序以将两个32位有符号数相乘并将答案存储为64位数,但我的代码只能给出正确的答案,最多可达32位。我已经对它进行了调查并搜索了许多网站,但无法让自己满意。虽然我调试了很多次,但我无法解决问题。这是我作为学生的第一个问题,所以如果我不清楚,我真的很抱歉。谢谢:)

; 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

我认为我的逻辑是对的,但后来我无法得到错误。任何帮助表示赞赏。 :)

1 个答案:

答案 0 :(得分:0)

multiplicand dd 0,9000008             ; 32bit multiplicand 64bit space  

您设置了64位空间,但您的代码修改了128位空间!

另外,由于没有多少努力,你应该交换被乘数的双字。