我知道printf
会返回 EAX 中打印的字符数。为什么printf
将寄存器 ECX 更改为0?我的代码片段:
push eax
push intFormat
call printf
add esp,8
我在64位Linux发行版上运行我的代码。
答案 0 :(得分:2)
如上所述 EAX 将具有来自printf
的返回值,但遵循CDECL调用约定(包含C库)的函数也可以使用 ECX 和 EDX 。他们可能不会改变,但他们可能并且他们的价值观不可能依赖于任何事物。您必须使用不会被破坏的不同寄存器(如果不使用PIC代码,也可以使用EBX,ESI,EDI也可用),或者您必须手动保留这些寄存器并将其恢复在printf
之后 - Michael Petch
有关调用约定/ ABI的更多信息,请参阅x86标记wiki。甚至还有一个FAQ部分,其中包含一个涉及此问题的条目。