Operation System: 关于寄存器和栈

来源:互联网 发布:mixer sam 软件 编辑:程序博客网 时间:2024/04/30 01:22

对于Intel架构的处理器,从8位的寄存器(8位的CPU)一直演进到如今的64位(64位寄存器),为了承上启下,到现在的64位的CPU还是可以运行当年8位CPU的程序,而如今的寄存器当中,依然是可以从64位中分出8位来应对8位的程序。


如今的寄存器如下图所示:(图片来源:http://wdxtub.com/2016/04/16/thin-csapp-2/):




如图所示,%ah, %al是8位的。%ax包含ah和al,是16bits。eax是32位,包含前面两种。另外最大的rax是64bits的。有几个寄存器有特殊的用途:%rax用来存返回值。%rsp是用来保持栈指针地址的,也就是当调用函数的时候要往下移的那个指针。其余的寄存器都可以用来寄存临时值。


其实还有一个寄存器叫:%rip,其实就是我们所指的PC。是无法访问和改变的。


另外,值得一提的是,到了64位的时代,传参的方式和32位不同了。32位的传参是通过调用函数前的压栈,不断把新的参数压到栈中。而64bits则是通过把参数移到寄存器中。


Arguments passed in registers:
%rdi, %rsi, %rdx, %rcx, %r8, %r9
Return value: %rax


栈是每个进程分得的内存空间的一部分。从http://blog.csdn.net/firehotest/article/details/52337697 这篇文章可以看出,栈是rsp不断往地址低反向增长的内存区域,而堆则是相反的,不断往地址增加的方向。它们两者共享着一篇为了程序增长所预留的空间。


所以,栈的形态如图:




栈的经典behavior是每次调用函数前,就是把return address push(程序代码也会在内存里的)进去。紧接着return address的就是另一片属于另外一个函数的内存空间了。



0 0
原创粉丝点击