对于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包.
以下我个人所写的包含资源文件的窗体消息代码的片段分析: