Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将负值与rdi寄存器进行比较的结果不正确_C_Macos_Assembly_Nasm_X86 64 - Fatal编程技术网

C 将负值与rdi寄存器进行比较的结果不正确

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

我有一个带有函数声明的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中,结果由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