c-负值与rdi寄存器的比较结果不正确



我有一个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位寄存器后进行隐式符号扩展。

查看编译器为调用程序生成的代码,并查看调试器中的寄存器值。

最新更新