深入X64的栈桢分配策略

本文深入探讨X64平台的栈帧分配策略,特别是在fastcall调用约定下的16字节对齐规则。通过分析X64下的函数入口与退出代码,揭示了栈指针 rsp 的处理细节,以及如何处理stdcall和fastcall调用在栈帧上的差异。文中还提供了一段包含Windows窗口消息处理的X64汇编代码示例,展示了栈对齐和影子空间的分配方式。
摘要由CSDN通过智能技术生成

      对于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包.

以下我个人所写的包含资源文件的窗体消息代码的片段分析:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值