一、保护原则
首先要明白ABI(Application Binary Interface, 应用程序二进制接口)主要是一个针对编译器的限定,它用以保证不同的编译器编译出的二进制代码以及同一编译器编译出的不同文件的代码之间可以安全交互。所以,如果我们要用高级语言和汇编混合编程,这里有些约定就必须明确。
举个例子,大家都知道在C语言中,EAX寄存器被用来存放返回值。同时大家也知道当一个函数调用发生时,被调用函数往往要先保存堆栈状态(通常是ESP与EBP),在函数返回前必须恢复堆栈。
这里就引出了一个问题,为什么这里EAX寄存器不需要保护而ESP和EBP必须要保护呢?
当然ESP和EBP必须保护的理由是显而易见的,因为函数调用前后的堆栈位置不能丢失。那么其他的寄存器又怎么样呢,到底ABI是怎么对这些寄存器进行限制的呢?
OK,让我们逐个来看。
1. EAX
被作为函数返回值。对于调用者来说,如果在调用后必须用到调用前的EAX的值,则调用者必须自己事先保存EAX,即使被调用函数没有返回值也必须遵守这个原则。
而对于被调用函数,可以随意的使用EAX,不需要对其作任何保护。
2. EBX
对于地址无关代码(position-independent code),该寄存器用被来存放全局偏移表基地址,并可以在函数间传递。
但不管是否地址无关代码,A
i386 ABI之寄存器保护规则
最新推荐文章于 2024-02-08 14:28:20 发布