在调用函数时,应该在堆栈中的哪个位置保存保存的寄存器?

时间:2017-09-16 01:54:24

标签: assembly x86

根据调用约定,在调用函数时,调用者必须保留一些寄存器,被调用者必须保留其他寄存器。

现在我试图了解堆栈中的哪个位置应该保存保存的寄存器。

我认为这是正确的立场:

enter image description here

1 个答案:

答案 0 :(得分:3)

术语"来电者保存的寄存器"并不意味着调用者必须保存它们;这意味着调用者在调用后无法指望它们具有任何合理的值,所以如果调用者关心值它必须保存它们。

调用者可能决定保存所有,部分或全部调用者保存寄存器。因此,他们必须在之前实际函数调用过程中的任何部分(参数和返回地址)。

同样,被叫方不需要 来存储ebp或被调用者保存寄存器;它只需要确保它们在返回时具有相同的值。如果它从未使用它们,那么没有理由保存它们。

调用约定中唯一真正不可变的部分是参数,返回地址,哪些寄存器是callee-save,以及返回值的方式。这些定义了一个函数如何与另一个函数交互,如果你改变了,那么没有人会知道如何调用你的函数/被调用的函数不知道它需要什么。对于其他一切,编译器可以并且可能会做任何方便的事情,你也可以。