在64的att汇编下调用printf函数会影响了多个寄存器的值,我看资料只有返回值会放到rax寄存器中,但是实际上rcx,rdx也受到了影响。我该如何确认调用c函数会影响到哪些寄存器?
参考GPT和自己的思路:
首先,需要注意的是,调用C语言函数时,传参和返回值的方式是由操作系统约定的,不同的操作系统可能有不同的约定。因此,关于影响哪些寄存器的问题,具体取决于你使用的操作系统和编译器。
一般来说,在64位的Linux系统中,第一个整型参数会被通过rdi寄存器传递,第二个整型参数会被通过rsi寄存器传递。而printf函数的第一个参数是一个格式化字符串,通常使用的是rodata段中的一个字符串常量,因此不会改变寄存器的值。而后面的参数(例如待输出的变量)会被传递到对应的寄存器中,也就是说,如果你调用printf函数时传递了一个整型变量,它会被传递到rdi或rsi寄存器中。
至于为什么看起来还有其他寄存器的值也被影响了,这可能是由于编译器优化或者函数内部实现的细节导致的。为了确切地判断哪些寄存器被影响了,可以查看编译器生成的汇编代码,或者使用调试工具进行跟踪和分析。