回 帖 发 新 帖 刷新版面

主题:汇编-编写程序:实现双字长(32 bit)无符号整数乘法

请哪位高手帮小弟这个忙吧、、
在下急需这个程序 啊!~
谢谢了~~

回复列表 (共14个回复)

沙发

在5月24日的那个帖子里已经回了,用的是分段的办法,测试过了可以

板凳


上次那个我试过了,不行啊!
我在DOS下建立OBJ文件时出现了“2个server error”有错 啊
请你帮忙再调试一下啊!
不然告诉我个好的软件编译啊
谢谢了

3 楼

我刚刚又试了一下,可以的,我用的是masm 6.15 ,代码还是一样的
    .model small
    .stack
    .data
buf1    dd 12345678h
buf2    dd 12345678h
result    dw 4 dup(0)
    .code
    .startup
    mov di,offset buf1
    lea si,buf2
    mov ax,[di]
    mov bx,[si]
    mul bx
    mov result,ax
    mov result+2,dx
    mov ax,[di+2]
    mul bx
    add result+2,ax
    adc result+4,dx
    mov ax,[di+2]
    mov bx,[si+2]
    mul bx
    add result+4,ax
    adc result+6,dx
    mov ax,[di]
    mul bx
    add result+2,ax
    adc result+4,dx
    adc result+6,0
    .exit 0
    end
对了,你那个出现的错误是关于什么方面的?

4 楼


[em2]程序我试过了可以了,但是我都不懂每一句的意思啊,你能不能帮人帮到底呢,帮我把每一行的每句话解释一下 啊!
急用,谢谢了!

5 楼


你上次给我的程序,运行后没有显示输出结果result的值
麻烦你帮忙再修改一下使其能够显示输出result的值,
还有如果有办法的话,能不能使程序提示输入两个数字,之后按回车显示相乘的结果呢 ?
谢谢了!~

6 楼

这个。。。难度有点大啊!尤其是输入的那个,比较令人头痛!

7 楼

.model small
    .stack
    .data
buf1    dd 12345678h
buf2    dd 12345678h
result    dw 4 dup(0)
    .code
    .startup
    mov di,offset buf1    ;获取第一个数据的地址
    lea si,buf2           ;获取第二个数据的地址
    mov ax,[di]           ;将第一个数据的低字节传给ax
    mov bx,[si]           ;将第二个数据的低字节传给bx
    mul bx                ;低字节相乘,结果放在dx.ax中
    mov result,ax         ;结果加到result的低16位
    mov result+2,dx       ;就像十进制的个位数和个位数相乘,结果加在个位和十位上一样
    mov ax,[di+2]         ;将第一个数据的高字节传给ax,bx还是放第二个数据的低字节
    mul bx                ;高字节和低字节相乘,结果放在dx.ax中 
    add result+2,ax       ;结果加到result的17到24位
    adc result+4,dx       ;就像十进制的十位数和个位数相乘,结果加在十位和百位上一样
    mov ax,[di+2]         ;将第一个数据的高字节传给ax
    mov bx,[si+2]         ;将第二个数据的高字节传给bx
    mul bx                ;高字节相乘,结果放在dx.ax中
    add result+4,ax       ;结果加到result的高16位
    adc result+6,dx       ;就像十进制的十位数和十位数相乘,结果加在百位和千位上一样
    mov ax,[di]           ;将第一个数据的低字节传给ax,bx还是放第二个数据的高字节
    mul bx                ;低字节和高字节相乘,结果放在dx.ax中
    add result+2,ax       ;结果加到result的17到24位
    adc result+4,dx       ;就像十进制的个位数和十位数相乘,结果加在十位和百位上一样
    adc result+6,0        ;上步结果有可能产生进位,若进位则加到高位去。
    .exit 0
    end

8 楼


如果输入的难度实在很大,那就算了,不过你有办法把result的值输出到界面吗?
即显示出来吗?

如果有的话帮忙弄下,没办法的话也就算了!

还是很感谢你 啊!~


谢谢啦!!高手。。。

9 楼


stack segment para stack
    dw 20H dup(30)
stack ends

data segment
buf1    dd 0000000fh
buf2    dd 00000008h
result  dw 4 dup(0) ;重复4个字单元,每个字单元预置数据0,共分配10*2=20(14H)个字节存储单元
 doubleword   db  64  dup(61h)
 doubleword1  db   71   dup(?)
data ends

code segment
   assume cs:code, ds:data, ss:stack
 start:
    mov ax,data
    mov ds,ax
;两个32位相乘的算法
    mov di,offset buf1   ;把offset的偏移地址给di
    lea si,buf2          ;把buf2的有效地址即偏移地址给si
    mov ax,[di]
    mov bx,[si]
    mul bx
    mov result,ax
    mov result+2,dx   ;result+2是在result的下一个字存储单元
    mov ax,[di+2]
    mul bx
    add result+2,ax
    adc result+4,dx
    mov ax,[di+2]
    mov bx,[si+2]
    mul bx
    add result+4,ax
    adc result+6,dx
    mov ax,[di]
    mul bx
    add result+2,ax
    adc result+4,dx
    adc result+6,0

;将result中数转存到doubleword这个存储空间中
       sub si,si
       xor cx,cx 
       mov cl,16
       mov bx,0001h
    lop:
       test result,bx
       jz   next
       mov  doubleword[si], 31h    ;87
       jmp  laa
    next:
         mov doubleword[si],30h
    laa:
         inc si
         shl bx,1
         loop  lop

         mov si,16
         xor cx,cx
         mov cl,16
         mov bx,0001h
    lop1:
         test  result+2,bx
         je   next1
         mov  doubleword[si],31h    ;102
         jmp  laa1
   next1:
         mov doubleword[si],30h
    laa1:
         inc si
         shl bx,1
         loop  lop1

       mov si,32
       xor cx,cx
       mov cl,16
       mov bx,0001h
    lop2:
       test  result[4],bx
       jz   next2
       mov  doubleword[si],31h   ;117
       jmp  laa2
    next2:
         mov doubleword[si],30h
     laa2:
         inc si
         shl bx,1
         loop  lop2

         mov si,48
         xor cx,cx
         mov cl,16
         mov bx,0001h
    lop3:
         test  result[6],bx
         jz   next3
         mov  doubleword[si],31h     ;132
         jmp  laa3
    next3:
         mov doubleword[si],30h
     laa3:
         inc si
         shl bx,1
         loop  lop3
;显示两数相乘的结果
        sub si,si
        sub bx,bx
        sub dx,dx
        sub di,di
        mov di,0h
        sub cx,cx
        mov cl,8
  lop4:  
        mov bl,cl
        mov cl,8
   www:
        mov dl,doubleword[si]
        mov doubleword1[di],dl
        inc si
        inc di
        loop  www

        mov doubleword1[di],2ch
        inc di
        mov cl,bl
        loop lop4

        sub si,si
        mov si,70
        sub cx,cx
        mov cl,71
lop5:
        mov dl, doubleword1[si]
        mov ah,02h
        dec si
        int 21h
        loop  lop5

;汇编结束
        mov ah,4ch
        int 21h
code ends
    end start


这个程序的算法是你写的,然后我叫了一个网友帮我写进去了一些程序使其可以输出result的值了,但是我还是看不懂他的意思,麻烦你帮我看一下,
帮我再一次说明一下每一行,每一句话的意思吧,好吗??

10 楼

    .model small
    .stack
    .data
buf1    dd 12345678h
buf2    dd 12345678h
result    dw 4 dup(0)
    .code
    .startup
    mov di,offset buf1
    lea si,buf2
    mov ax,[di]
    mov bx,[si]
    mul bx
    mov result,ax
    mov result+2,dx
    mov ax,[di+2]
    mul bx
    add result+2,ax
    adc result+4,dx
    mov ax,[di+2]
    mov bx,[si+2]
    mul bx
    add result+4,ax
    adc result+6,dx
    mov ax,[di]
    mul bx
    add result+2,ax
    adc result+4,dx
    adc result+6,0
    call output
    .exit 0
    ;
output  proc
    push ax                  ;保护寄存器的内容
    push BX                  ;同上
    push CX                  ;同上
    push DX                  ;同上
    push di                  ;同上
    mov di,offset result+6   ;从最高字开始输出
    mov bx,4                 ;共需要输出4次(外层循环)
show:     mov dx,word ptr[di]      ;将最高字的值传入dx
    mov cl,4                 ;显示一个字需要4次
    mov ch,4                 ;一次显示一个16进制数(4位2进制可用一位16进制数表示)
adjust:    rol dx,cl                ;循环右移4位,将高四位的值放到低四位,准备显示
    push dx                  ;保存移位后的结果以备下次显示使用
    and dx,000fh             ;屏蔽高12位的内容,为显示低4位的值做准备
    cmp dx,9                 ;测试低四位的值是否大于9
    jbe display              ;如果低四位的值小于等于9,直接转换为其ascii码
    add dx,07h               ;大于9则调整(A的ascii码是41h)
display:  add dl,30h                ;1-9的ascii码从30h-39h,故加30h
    mov ah,02h                ;显示
    int 21hd
    pop dx                    ;取出刚才保存的dx内容
    dec ch                    ;循环次数减一(内层)
    jnz adjust                ;少于四次继续显示
    sub di,2                  ;准备显示次低字的内容
    dec bx                    ;循环次数减一(外层)
    jnz show                  ;少于四次继续显示
    pop di                    ;恢复寄存器的内容
    pop dx                    ;恢复寄存器的内容
    pop cx                    ;恢复寄存器的内容
    pop bx                    ;恢复寄存器的内容
    pop ax                    ;恢复寄存器的内容
    ret
output     endp    
    end
显示result的值我用了个子程序(不用也可以),至于你那个网友写的程序,我没有看,因为太长了看了就头大,还有就是程序希望lz自己也能好好分析下,这样才会提高,其实我也只是个初学者,才刚开始学汇编,我觉得只有不断的去写去分析才能真正掌握一些知识,在此与楼主共勉,一起加油啊!

我来回复

您尚未登录,请登录后再回复。点此登录或注册