我是靠谱客的博主 孝顺雨,最近开发中收集的这篇文章主要介绍Operation System: 关于寄存器和栈,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

对于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: 关于寄存器和栈所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部