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的就是另一片属于另外一个函数的内存空间了。
- Operation System: 关于寄存器和栈
- Operation System
- 关于寄存器ESP和EBP
- 关于STM32影子寄存器和预装载寄存器和TIM_ARRPreloadConfig
- 关于STM32影子寄存器和预装载寄存器和TIM_ARRPreloadConfig
- 关于STM32影子寄存器和预装载寄存器和TIM_ARRPreloadConfig
- Next Generation Operation System
- operation system not found
- generic operation system : process
- Operation System: 多线程笔记
- 关于内存单元和寄存器的大小
- 关于GPIO的BSRR和BRR寄存器
- 关于EIP、EBP和ESP寄存器
- 关于x86中的CS 和 IP 寄存器
- 关于STM32_GPIO的BSRR和BRR寄存器
- 关于寄存器
- 关于寄存器
- 关于System.in和System.out
- 动态规划——数字三角形问题(空间优化)
- Linux进程状态
- 释疑のSmartforms点打印无反应
- OpenGL: 渲染管线理论
- Rails安装eventmachine提示出错的解决方法
- Operation System: 关于寄存器和栈
- Visual Studio 2015的破解密钥
- Java多线程学习(吐血超详细总结)
- 设置USB数据监听
- Go常见名词
- JSONP原理及使用
- 常见汇编指令及范例解释
- 初始Android
- C#中protected用法详解