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