这张图已经写得比较清楚了,下面三哥哥再解说一下
对于微软Windows系统在x64架构CPU下的运作规则是怎么样的,这里指的是平台系统x64 ABI规则。
系统ABI(应用程序二进制接口)规则包括哪些方面,这是大家需要自己去了解的内容,这里仅提供一条学习指引。
无论是系统API函数或者是自建函数,它们之间的调用都必须遵守相应的约定。ml64汇编编译器必须且一定是对应实现了操作系统这套约定了的,这样我们的程序才会正常工作。
什么是调用约定:指函数间约定待传参数存放顺序及存放在哪里和取参数顺序及到哪里取、哪些寄存器要保护及由谁来做、栈平衡回收是由调用方还是被调用方来做。(思考并拿笔画一画图)
简单说下,x64函数体内的栈空间需要16字节对齐。这个对齐的意思不仅体现了栈空间大小是16的倍数,而且最低的栈地址即rsp指向位置也是16字节对齐的,一个说的是空间大小,一个说的是地址对齐,但两者一定联动。
对齐的栈地址结尾数字必然为0,可以推断出当函数A调用函数B,返回地址被压入栈空间那一刻,栈地址就不是16字节对齐了(结尾数字为8),后续就是考虑函数调用约定,凑出B函数栈空间需要开辟多少字节才能满足B函数体内的16字节对齐要求。
有人总结了16n+8公式体,16n是n个变量的16倍怎么都是对齐的,多出这个8字节为的是跟压入栈的返回地址一起凑成16字节(保护非易变寄存器的压栈数这部分也要算进去)。当然还可以以别的视角去看待对齐,每个人的思考都会不同,用心去研究不要被既有局限了认知。
说说函数的栈空间布局问题,示意图已经展示的非常清晰了,作者在这里想提到的一个重点中的重点还是让大家自己学会独立思

本文介绍了x64架构下微软Windows系统的ABI规则,强调了函数调用约定和栈空间16字节对齐的重要性。通过理解调用约定、栈空间布局和寄存器使用,有助于深入掌握x64汇编编程。建议读者动手绘制模型以提升理解,并通过编写简单程序实践栈区分配变化。


308

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



