两个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]