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"为后缀的可执行文件。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)