鱼C论坛

 找回密码
 立即注册
查看: 1960|回复: 0

两个64位的二进制数相乘

[复制链接]
发表于 2018-11-29 18:08:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 水柔炎 于 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   dd  11,22   ;定义一个64位的二进制数据x
    y   dd  33,44
    z   dd  4 dup(0)
    szText db "Hello World!", 0
    szFmt db 'Z+12=%u,Z+8=%u,Z+4=%u,Z=%u', 0
    szTest  db  '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 [ebx],eax
    mov [ebx+4],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

这是完整的代码,今天老师给我们讲了分享给大家看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-7 19:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表