X86 通用寄存器使用惯例
2016-05-03 17:10
239 查看
在多任务系统中,给定的时刻只能有一个过程是活动的, 它占使用CPU的程序寄存器组. 程序寄存器组作为一个单个资源被所有的函数过程共享. 所以, 我们必须保证: 一个过程(调用者)调用另一个(被调用者)时, 被调用者不会覆盖某个调用者稍后会使用到的寄存器的值.
为此, IA32(x86)采用了一组统一的寄存器使用惯例., 所有的过程调用都必须遵守, 包括程序库中的过程.
根据惯例, 寄存器%eax, %ecx, %edx被划分为由调用者保存的寄存器. 寄存器%ebx, %esi, %edi被划分为由被调用者保存的寄存器. 此外必须保持寄存器%ebp和%esp.
过程P希望它计算出来的x值在调用了Q之后仍然有效. 如果x放在一个调用者保存寄存器中, 而P(调用者)必须在调用Q之前保存这个值, 并在Q返回之后恢复该值.
如果x在一个被调用者保存寄存器中, Q(被调用者)想使用这个寄存器, 那么Q在使用这个寄存器之前, 必须保存这个值, 并在返回前恢复它.
在这两种情况中, 保存就是将寄存器的值压入栈中, 而恢复是指从栈中弹出到寄存器中.
为此, IA32(x86)采用了一组统一的寄存器使用惯例., 所有的过程调用都必须遵守, 包括程序库中的过程.
根据惯例, 寄存器%eax, %ecx, %edx被划分为由调用者保存的寄存器. 寄存器%ebx, %esi, %edi被划分为由被调用者保存的寄存器. 此外必须保持寄存器%ebp和%esp.
int P() { int x = f(); /* Some computation */ Q(); return x; }
过程P希望它计算出来的x值在调用了Q之后仍然有效. 如果x放在一个调用者保存寄存器中, 而P(调用者)必须在调用Q之前保存这个值, 并在Q返回之后恢复该值.
如果x在一个被调用者保存寄存器中, Q(被调用者)想使用这个寄存器, 那么Q在使用这个寄存器之前, 必须保存这个值, 并在返回前恢复它.
在这两种情况中, 保存就是将寄存器的值压入栈中, 而恢复是指从栈中弹出到寄存器中.
相关文章推荐
- 2.JS中的数据类型与变量
- Java 8怎么了之二:函数和原语
- windowManager.addView()抛出WindowManager$InvalidDisplayException异常
- 第十一周补充项目 3.1点直线类
- 二、进程间通信
- Android 短信拦截及用途分析
- 1-6-06:校门外的树
- iOS使用Object-C自定义cordova插件(二)
- 如何实现单服务器300万个长连接的?-来自知乎的经典问答
- javascript 手机号码正则表达式验证函数
- android webview设置以及与h5交互
- shell 中的单行注释和多行注释
- Python获取指定文件夹下的文件名
- IOS MenuController初步了解
- 知问前端——验证插件(二)
- [置顶] 新博客地址
- Jetty的工作原理以及与Tomcat的比较
- 1.JavaScript如何使用
- 吝啬的国度
- ELASTICSEARCH几个问题的解决