答案 0 :(得分:3)
术语"来电者保存的寄存器"并不意味着调用者必须保存它们;这意味着调用者在调用后无法指望它们具有任何合理的值,所以如果调用者关心值它必须保存它们。
调用者可能决定保存所有,部分或全部调用者保存寄存器。因此,他们必须在之前实际函数调用过程中的任何部分(参数和返回地址)。
同样,被叫方不需要 来存储ebp
或被调用者保存寄存器;它只需要确保它们在返回时具有相同的值。如果它从未使用它们,那么没有理由保存它们。
调用约定中唯一真正不可变的部分是参数,返回地址,哪些寄存器是callee-save,以及返回值的方式。这些定义了一个函数如何与另一个函数交互,如果你改变了,那么没有人会知道如何调用你的函数/被调用的函数不知道它需要什么。对于其他一切,编译器可以并且可能会做任何方便的事情,你也可以。