为什么printf覆盖ECX寄存器?

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

 push eax push intFormat call printf add esp,8 

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

就像你知道的那样, EAX将具有printf的返回值,但是遵循CDECL调用约定(包括C库)的函数也可能会使ECXEDX破坏。 他们可能不会改变,但他们的价值和价值不能被任何东西所依赖。 你将不得不使用不同的寄存器,不要破坏(如果不使用PIC代码,ESI,EDI也是可用的,EBX是可用的),或者你必须手动保存这些寄存器并在printf之后恢复它们。 – Michael Petch

有关调用约定/ ABI的更多信息,请参阅x86标记wiki。 甚至有一个常见问题部分,涉及这个问题的条目。