【问题标题】:Incorrect result of comparison of negative value against rdi register负值与 rdi 寄存器的比较结果不正确
【发布时间】:2018-11-17 19:12:22
【问题描述】:

我有一个 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 寄存器返回。

【问题讨论】:

    标签: c macos assembly nasm x86-64


    【解决方案1】:

    您将参数声明为int,这是一个 32 位类型。它没有符号扩展来填充rdi,只有edi

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多