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