哪些寄存器在函数中可以安全使用(x86)

Bar*_*uch 8 x86 assembly abi

根据维基百科,英特尔ABI允许使用EAX,ECXEDX不是在功能中保留它们.
我不确定"Intel ABI"是什么意思.这是否意味着所有针对Intel CPU的编译器都强制执行/遵循它?我正在编写一个将从C代码调用的汇编函数.我可以为所有编译器假设这个吗?(我x86目前只针对目标)

Sec*_*att 6

英特尔ABI只是英特尔建立的呼叫惯例.

通常,在函数调用期间如何传递参数以及保存或删除哪些寄存器由函数的调用约定定义:

http://en.wikipedia.org/wiki/Calling_convention

特别是对于__cdecl,__ stdcall和__fastcall,您应该期望EAX,ECX和EDX被删除,并且您的函数应该保留其他寄存器并返回EAX(或EDX:EAX以返回64位).

如果您不知道应该使用的调用约定是什么,则不应该在汇编中编写,因为搞乱调用约定会导致应用程序中出现可利用的错误.

在C中,默认调用约定通常是__cdecl,对于Windows导出的API,它通常是__stdcall.