如何在创建cdecl函数时保留寄存器的状态?

时间:2015-01-08 13:38:22

标签: assembly x86 calling-convention cdecl

我正在编写一个使用cdecl调用约定的函数,因此我需要确保在调用函数之前保留寄存器的状态。

我的问题是这通常是如何进行的。是否只是在函数开始时将堆栈中的寄存器推出,然后将它们弹出到函数末尾的寄存器中?

1 个答案:

答案 0 :(得分:1)

  

我正在编写一个使用cdecl调用约定的函数,因此我需要确保在调用函数之前保留寄存器的状态。

您可能知道,您可以随意使用EAX,ECX和EDX,但您需要保存pretty much everything else

  

我的问题是这通常是如何进行的。是否只是在函数开始时将堆栈中的寄存器推出,然后将它们弹出到函数末尾的寄存器中?

是的,这通常是如何完成的。在开始时推动所有内容,然后返回POP。

但有时使用调用者保存的寄存器可能是有意义的。 假设你从不在你的函数中使用EDX,并且你没有以可能触及它内容的方式调用任何函数。但是你想在你的函数中使用EDI。您可以将EDI保存在堆栈中,也可以将其保存在EDX中。

mov edx, edi
; Do something with EDI without corrupting EDX, e.g. string manipulation
mov edi, edx

而不是

push edi
; Do something with EDI, e.g. string manipulation
pop edi

使用寄存器比使用寄存器略快,因此如果您在循环中使用此函数,这可能会带来一些明显的性能提升。

请注意,您没有拥有来保存所有内容并在返回之前恢复它。 您可以在使用之前保存一个寄存器,并在完成后立即将其恢复到函数中间。