为什么printf会覆盖ECX寄存器?

时间:2016-04-26 21:22:51

标签: linux assembly x86 nasm

我知道printf会返回 EAX 中打印的字符数。为什么printf将寄存器 ECX 更改为0?我的代码片段:

push eax    
push intFormat
call printf 
add esp,8

我在64位Linux发行版上运行我的代码。

1 个答案:

答案 0 :(得分:2)

如上所述 EAX 将具有来自printf的返回值,但遵循CDECL调用约定(包含C库)的函数也可以使用 ECX EDX 。他们可能不会改变,但他们可能并且他们的价值观不可能依赖于任何事物。您必须使用不会被破坏的不同寄存器(如果不使用PIC代码,也可以使用EBX,ESI,EDI也可用),或者您必须手动保留这些寄存器并将其恢复在printf之后 - Michael Petch

有关调用约定/ ABI的更多信息,请参阅标记wiki。甚至还有一个FAQ部分,其中包含一个涉及此问题的条目。