概述
对于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的就是另一片属于另外一个函数的内存空间了。
最后
以上就是孝顺雨为你收集整理的Operation System: 关于寄存器和栈的全部内容,希望文章能够帮你解决Operation System: 关于寄存器和栈所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复