首页 > 解决方案 > 负值与 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 寄存器返回。

标签: cmacosassemblynasmx86-64

解决方案


您将参数声明为int32 位类型。它没有符号扩展为 fill rdi,只有edi

RDI 的上半部分是调用者留下的任何随机垃圾。在许多情况下为零,来自写入 32 位寄存器后的隐式符号扩展。

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


推荐阅读