我正在编写一个使用cdecl
调用约定的函数,因此我需要确保寄存器的状态在调用函数之前保持不变。
我的问题是这通常是如何执行的。只是在函数开始时将寄存器压入堆栈然后在函数结束时将它们弹出到寄存器中吗?
我正在编写一个使用cdecl
调用约定的函数,因此我需要确保寄存器的状态在调用函数之前保持不变。
我的问题是这通常是如何执行的。只是在函数开始时将寄存器压入堆栈然后在函数结束时将它们弹出到寄存器中吗?
我正在编写一个使用 cdecl 调用约定的函数,因此我需要确保寄存器的状态在调用该函数之前保持不变。
您可能知道,您可以使用 EAX、ECX 和 EDX 自由地做您想做的事,但您需要保存几乎所有其他内容
我的问题是这通常是如何执行的。只是在函数开始时将寄存器压入堆栈然后在函数结束时将它们弹出到寄存器中吗?
是的,这通常是这样做的。PUSH 一切在开始,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
使用寄存器比使用堆栈稍快,因此如果您在循环中使用此函数,这可能会带来一些明显的性能改进。
请注意,您不必一开始就保存所有内容并在返回之前将其恢复。您可以在使用它之前保存一个寄存器,并在完成后立即在函数中间恢复它。