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