IAA32过程调用保护规则注册

因为操作系统共享性质,所以,寄存器已成为各种处理或共享资源的处理。然后,该过程发生 当所谓的。假设呼叫者使用内部寄存器值。但这个寄存器的内容,很可能在该呼叫者的执行的过程中改变,用过程执行之前,对该寄存器里面的内容进行保护,以至于不会出错,寄存器的保护规则也是由于程序的不可再现性而存在的。


在IA32上,实行了一个统一的寄存器保护规则。首先,我们要看一下。计算机中有多少个比較重要的寄存器

(偷偷懒我就不写寄存器前面的百分号了O(∩_∩)O)

eax 这个寄存器属于调用者保存寄存器,通经常使用来存储一些函数的返回值

edx ecx这两个也是属于调用者保存寄存器,而且 属于通用寄存器,能够任意保存数据,没有 什么特定的 限制。

ebx edi esi这三个寄存器属于被调用者保存寄存器。通常来说edi 和 esi可能会保存一些被调用函数的參数。

这里要说明一下一个概念,就是我非常疑惑的,什么叫做调用者保存寄存器。什么叫做被调用者保存寄存器。

两者的差别,我认为能够用以下的图示来说明一下。


上面的图示说明 ,寄存器依照规则被分类了。左面的三个寄存器是调用者负责保存,右边三个寄存器是被调用者负责保存。也就是说,在过程调用的时候。假设被调用者程序会覆盖左边三个寄存器的内容,那么,假设这三个寄存器内容在过程调用结束之后还要用到没调用过程之前的那个数值的话,就要有人在过程调用发生之前保存这个寄存器里面的数值,可是由谁来保存呢?仅仅能由调用者去保存,也就是说。被调用者是不会管你这里面有什么重要的数据的。他拿过来就用。可是调用者假设须要这里面的数据。就要自己提前保存。

说的再直白一点,就是寄存器是不论什么程序都能够随便用的,可是里面数据的保存工作就是有责任人的。左边三个寄存器的责任人是调用者。右边三个寄存器的责任人是被调用者。

我认为这样理解是正确的,假设我恰好理解反了,还希望大家给我指出来。



还有两个比較重要的寄存器:

esp是栈顶指针的寄存器

ebp是基址寄存器


学过汇编的人会知道,在进行过程调用的时候,主要是用程序栈来支持过程的调用。而且机器也会利用栈来存储一些參数。

这样一来,在过程调用中,上面两个寄存器里面的数据就变得相当重要。在一个过程调用的时候,必需要保存旧的ebp里面的数据,而且初始化的时候也需要movl ebp esp这种指令将两个栈指针初始化一下,之后,esp会随着过程的调用进行扩展增长。在过程调用结束的时候。要有一些指令进行恢复和清理工作。把栈恢复成这次调用之前的样子。那么我们就要进行例如以下 两个指令

mov ebp esp
popl ebp
第一条指令是清理工作,也就是释放栈空间,把栈顶指针移动到基址指针的地方,由于在call指令运行的时候,调用者会把被调用过程完毕之后下一条指令的地址压入栈中。所以,在popl将旧的基地址恢复之后。esp也就向栈低移动 到下一个指令的地址到那里运行。作为一个恢复和清理通话完成后,将结束。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/gcczhongduan/p/4681177.html