在x86-64上内存的分布(译文)

  • 在几个月前我曾今写过一篇文章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函数中的结构

这篇文章是个烂尾文章,有空在完善吧

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 10,181评论 1 19
  • 这篇文章主要针对eip,esp,ebp寄存器进行介绍,有关别的通用寄存器在很多汇编相关书籍中都有介绍,由于篇幅有限...
    Hello密斯托李阅读 3,887评论 0 0
  • 堆栈是连续的地址空间,且向低地址端生长。 esp 是堆栈指针ebp 是基址指针那两条指令的意思是将栈顶指向ebp的...
    wyrover阅读 4,855评论 0 1
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 12,370评论 0 27
  • 我憎恶你的暴脾气像忽然爆发的地震,八级震开了我压在心底的所有恐惧、不安与消极 我害怕你的暴脾气巴结讨好还是该沉默不...
    白宝宁阅读 1,748评论 1 2