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

时间:2018-11-17 19:12:23

标签: 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));
}

该功能在汇编器中实现,代码:

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寄存器返回。

1 个答案:

答案 0 :(得分:4)

您将参数声明为int,这是一种32位类型。它不会符号扩展来填充rdi,而仅填充edi

RDI的上半部分是呼叫者留在此处的任何随机垃圾。在许多情况下,零是由于写入32位寄存器后隐式符号扩展引起的。

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