使用cmpq和je时无限循环

时间:2011-12-01 17:54:51

标签: assembly x86-64 decrement cmp

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

可能是什么问题?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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;
}