水柔炎 发表于 2018-11-29 18:08:57

两个64位的二进制数相乘

本帖最后由 水柔炎 于 2018-11-29 18:10 编辑

.486            ;使用了486模式
.model flat, stdcall

option casemap:none

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\msvcrt.lib


include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
include \masm32\include\msvcrt.inc



.data
    x   dd11,22   ;定义一个64位的二进制数据x
    y   dd33,44
    z   dd4 dup(0)
    szText db "Hello World!", 0
    szFmt db 'Z+12=%u,Z+8=%u,Z+4=%u,Z=%u', 0
    szTestdb'x=%u,y=%u',0
.code
start:
    invoke StdOut, addr szText
    lea ebx,z
    mov esi,y
    mov edi,y+4

    ;下面完成的是两个低32位x*y,结果保存在z(低32位),z+4(高32位)
    mov eax,x
    mul esi
    mov ,eax
    mov ,edx

    ;下面完成的是x的高32位与y的低32位相乘,乘法结果的高32位送z+8,低32位加入z+4,若加法有进位,应向z+8进位
    mov eax,x+4
    mul esi
    add z+4,eax
    adc z+8,edx   

    ;下面完成的是x的低32位与y的高32位相乘,乘法结果的低32位加入z+4,高32位加入z+8,若z+4加法有进位,应该要向z+8进位
    mov eax,x
    mul edi
    add z+4,eax
    adc z+8,edx

    ;下面完成的是x的高32位与y的高32位相乘,乘法结果的低32位加入z+8,高32位送入z+12,若z+8加法有进位,应该向z+12进位
    mov eax,x+4
    mul edi
    add z+8,eax
    adc z+12,edx

    invoke crt_printf, addr szTest, x , y   
   
    invoke crt_printf, addr szFmt, z+12 ,z+8, z+4,z   
    ret
end start

这是完整的代码,今天老师给我们讲了分享给大家看看
页: [1]
查看完整版本: 两个64位的二进制数相乘