首页
社区
课程
招聘
[原创]Windows下的64位汇编语言
发表于: 2013-11-18 00:52 25548

[原创]Windows下的64位汇编语言

2013-11-18 00:52
25548

讲重点:
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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (5)
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
2
沙发.支持...
2013-11-18 02:25
0
雪    币: 45
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼主,有没有64位的汇编书籍介绍一两本。
2013-11-18 09:11
0
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
总结得真好。64位的时代迟早会来的。
2013-11-18 10:06
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
写64位汇编还是用JWasm比较好,微软的x64编译器和ARM编译器都是一泡污
2013-11-19 11:07
0
雪    币: 455
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习了!!
2014-8-8 11:37
0
游客
登录 | 注册 方可回帖
返回
//