我正在编写一个使用cdecl
调用约定的函数,因此我需要确保在调用函数之前保留寄存器的状态。
我的问题是这通常是如何进行的。是否只是在函数开始时将堆栈中的寄存器推出,然后将它们弹出到函数末尾的寄存器中?
答案 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
使用寄存器比使用寄存器略快,因此如果您在循环中使用此函数,这可能会带来一些明显的性能提升。
请注意,您没有拥有来保存所有内容并在返回之前恢复它。 您可以在使用之前保存一个寄存器,并在完成后立即将其恢复到函数中间。