-
-
[原创]Windows下的64位汇编语言
-
发表于:
2013-11-18 00:52
25549
-
讲重点:
1.MS的64位编译器使用fastcall约定调用,即最前面的四个参数,rcx,rdx,r8,r9,(不是参数是寄存器,函数的是参数)传递四个最开头的参数,从左至右依次排,多余4个参数,四个寄存器显然没法放,就要放到栈中,依然从左至右,栈地址增加排列,前4个参数的栈空间保留。(fastcall在各个编译器设定不同,这个是ml64)
2.呼叫函数前必须申请栈,这个特性在Win32中还不太明显,因为stdcall也好还是cdecl也好,呼叫函数前都会push参数,没有参数就不push,push指令在更改esp相当于申请栈空间,而64位的fastcall则不同小于5个参数的话,不用push,但是仍然保留20H的栈空间,这个空间可能会在调用的函数会使用,若不保留此空间,可能会引发访问内存越权,其实这个类似push。
所以写个Helloworld时,直接将四个参数弄到rcx,rdx,r8,r9即可:
extrn MessageBoxA: proc
sub rsp,28H
xor rcx,rcx
lea rdx,szTxt ;; 字符
lea r8,szTxt ;; 字符
mov r9,40H
call MessageBoxA
add rsp,28H
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课