64位程序怎么用汇编写

64位程序怎么用汇编写,第1张

用汇编写64位程序与32位下有以下几点不同:

1,所用的寄存器不同于32下的eax,ebx,ecx,edx,esi,edi,esp,ebp等,在64位下是rax,rbx,rcx,rdx,rsi,rdi,rsp,rbp,此外又增加了r8,r9,r10,r11,r12,r13,r14,r15等寄存器。但eax,ax,ah,al等依然可用,且增加了spl,bpl等8位寄存器调用,r8等也可以用r8d,r8w,r8b进行32位,16位,8位的调用。

2,函数调用参数传递不同于32下的stdcall规范,而采用fastcall,前四个参数为别放入rcx,rdx,r8,r9四个寄存器中,并在堆栈中留出4*8=32个字节的空间,多于四仿核个的参数放入堆栈。

3,函数调用后,由调用者负责堆栈回收。

看一个例子吧:

include \masm64\inc\user32.inc 头文件

includelib \masm64\lib\user32.lib 库文件

.data 定义数据段

strTittle db "Hello",0

strCaption db "How are you",0

.code 代码段

Main proc 入口过程,需在汇编时定义

sub rsp,28H 为前四个参数预留堆栈空间

xor rcx,rcx 第一个参数0放入rcx中

lea rdx,strCaption 把要显示的字符串地址做为第二个参数放入rdx中

lea r8,strTittle把消息框的标题衫大尘字符串地址做为第三个参数放或禅入r8中

xor r9,r9把第四个参数0 放入r9中

call MessageBoxA 调用MessageBoxA函数

add rsp,28H 堆栈清理

ret返回

Main ends

end

前目录中,在命令行下,输入"ml cc.asm"命令,可完山返腊成编译和连接。

在masm中,编译是世源针对源文件的,源文逗滑件需为以".asm"为后缀的文本文件。编译产生的是目标文件。而连接是针对目标文件的,目标文件需为编译时产生的,以“.obj”为后缀的二进制文件。连接产生的是以".exe"为后缀的可执行文件。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12443857.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存