根据Wikipedia,英特尔 ABI 允许使用EAX
,ECX
并且EDX
不将它们保存在函数中。
我不确定“英特尔 ABI”是什么意思。这是否意味着所有针对英特尔 CPU 的编译器都强制/遵循它?我正在编写一个将从 C 代码中调用的汇编函数。我可以为所有编译器假设这个吗?(我x86
目前只针对)
2 回答
英特尔 ABI 只是英特尔建立的调用约定。
通常,在函数调用期间如何传递参数以及保存或丢弃哪些寄存器由函数的调用约定定义:
http://en.wikipedia.org/wiki/Calling_convention
特别是对于 __cdecl、__stdcall 和 __fastcall,您应该期望 EAX、ECX 和 EDX 被丢弃,并且您的函数应该保留其他寄存器并在 EAX 上返回(或 EDX:EAX 用于 64 位返回)。
如果您不知道应该使用什么调用约定,则不应该使用汇编语言编写,因为弄乱调用约定可能会导致应用程序中出现可利用的错误。
在 C 中,默认调用约定通常是 __cdecl,对于 Windows 导出的 API,它通常是 __stdcall。
It's the Intel Application Binary Interface, a set of rules dictating things like what registers are available for use without saving, how arguments are pushed on the stack, whether caller or callee cleans up the stack frames and so on.
If you know that the rules are being followed, that's fine. I tend to save everything just in case (other than those things I'm using for returning information of course).
But it's not necessarily enforced for all compilers and you would be unwise to think so unless the compiler specifically states it.