- 在几个月前我曾今写过一篇文章Where the top of the stack is on x86这篇文章的主要目的使用了解释栈在x86架构上使用的误区。这篇文章将结合图片的形式去阐述堆栈在方法调用过程中的分布。
- 在这篇文章里面我将在新版本64-bit上验证x86架构堆栈上的布局, x64 [1]
我们重点将放在Linux和其它遵循官方V AMD64 ABI操作系统上。Windows用到少量的ABI,我在文章结尾处简单介绍它。
注册表
x86仅仅只有8个寄存器可以用(eax, ebx, ecx, edx, ebp, esp, esi, edi),x64将它们扩展到64位,(前缀r替换前缀e),并且添加了另外8个(r8, r9, r10, r11, r12, r13, r14, r15),由于x86有一些特殊的隐藏作用,并且并未真正的通用(特别值得注意的是ebp和esp), 因此它的有效内存分布长度要比实际的更长。
在一篇专门介绍堆栈分布的文章中介绍这些是有原因的。相当大一部分可用寄存器影响了一些重要ABI的设计,比如在寄存器中传递参数,从而是堆栈比以前有更大的作用空间。
参数传递
在这里我将有意简化讨论,并且将注意力放在整形和指针上。通过ABI, 前6个整形或指针在寄存器中的传递, 起始内存空间rdi,第二个rsi,第三个是rdx然后是rcx接着是r8和r9,只有第七个和它之后的参数在堆栈上传递
堆栈结构
考虑到上述情况,我们来看一下堆栈在c函数中的结构
这篇文章是个烂尾文章,有空在完善吧