3

我在每次迭代中递减 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。

可能是什么问题呢?

4

2 回答 2

6

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

于 2011-12-01T18:06:10.103 回答
3

问题是您使用相同的寄存器 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;
}
于 2011-12-01T18:10:13.990 回答