我有一个C,64位程序,它有一个函数声明,如下所示:
#include <stdio.h>
extern double wartosc (double a, double b, double x, int n);
int main() {
printf("%f", wartosc(4, 3, 2, -2));
}
该函数在汇编程序中实现,代码:
section .text
global _wartosc
_wartosc:
cmp rdi, 0
jl finish
xorpd xmm0, xmm0
finish:
ret
为什么printf函数输出0?与rdi寄存器的论点比较似乎是无效的
若我理解正确,参数a、b、x被传递到xmm0、xmm1和xmm2寄存器,并且最后一个参数在rdi中,结果由xmm0寄存器返回。
您将参数声明为int
,这是一个32位类型。它没有符号扩展来填充rdi
,只有edi
。
RDI的上半部分是调用者留在那里的任何随机垃圾。在许多情况下,从零开始,在写入32位寄存器后进行隐式符号扩展。
查看编译器为调用程序生成的代码,并查看调试器中的寄存器值。