对于X64只支持fastcall调用规则,实测win7下的x64编程,尽量保证16字节对齐,即在进入某个函数入口前是16字节对齐的,这样保证了对栈中数据成员的16字节访问是对齐的,如SSE系列需要这个限制.
win32/win64统一编程已初见成效,在此探索过程中深有体会,机会编程要不得,特别是关于rsp栈指针的处理,到底应该减多少加多少合适?
由于ml64.exe默认情况下编译出来的有prolog 和epilog 代码. 为了深入rsp的处理细节,在每个函数的开头与结尾加上了
(关闭开场码与结束码)
OPTION PROLOGUE:None
OPTION EPILOGUE:None
....
函数体
....
(恢复默认的开场码与结束码)
OPTION PROLOGUE:PROLOGUEDEF
OPTION EPILOGUE:EPILOGUEDEF
这样函数内部也要加上push rbp mov rbp,rsp .....leave ret
这样的代码就不能统一用于win32和win64了,因为一个是stdcall ,一个是x64形式下的fastcall (x86与x64的fastcall也不同) 所以下面的程序仅仅分析能使X64编译成功的代码. 请注意每个细节,包括函数与子函数参数个数和局部变量个数对rsp的影响. 更多细节在代码注释中了.
如果要统一,可以将上面多出来的部分删掉.@INVOKE 为个人所写,用于stdcall和fastcall中. @IF宏取自masm64包.
以下我个人所写的包含资源文件的窗体消息代码的片段分析:

本文深入探讨X64平台的栈帧分配策略,特别是在fastcall调用约定下的16字节对齐规则。通过分析X64下的函数入口与退出代码,揭示了栈指针 rsp 的处理细节,以及如何处理stdcall和fastcall调用在栈帧上的差异。文中还提供了一段包含Windows窗口消息处理的X64汇编代码示例,展示了栈对齐和影子空间的分配方式。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



