【问题标题】:Infinite loop when using cmpq and je使用 cmpq 和 je 时的无限循环
【发布时间】:2011-12-01 17:54:50
【问题描述】:

我会在每次迭代中递减 RAX。如果 RAX 为零,程序应该改变流程。

# AT&T syntax
start_calc_factorial:
  decq %rax
  cmpq $0, %rax
  je quit_calc_factorial
  mulq %rcx
  jmp start_calc_factorial

但是,程序永远不会终止。调试器告诉我RAX 的值为0xa0257c7238581842(它可能下溢,但不应该因为je 指令)。 RAX的初始值为7。

可能是什么问题?

【问题讨论】:

    标签: assembly x86-64 decrement cmp


    【解决方案1】:

    我相信乘法的结果存储在 RAX 寄存器中,这样肯定会弄乱循环。

    【讨论】:

      【解决方案2】:

      问题是您使用相同的寄存器 rax 作为参数和乘积。 你的代码相当于这个 C 代码:

      while (1)
      {
        rax = rax - 1;
        if (rax == 0) break;
        rax = rax * rcx;
      }
      

      如果不是永远,它可以循环很长时间。

      你可能想要的是这个:

      while (1)
      {
        rcx = rcx - 1;
        if (rcx == 0) break;
        rax = rax * rcx;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-31
        • 1970-01-01
        • 2020-07-14
        • 2021-04-28
        • 1970-01-01
        • 1970-01-01
        • 2015-07-17
        相关资源
        最近更新 更多