Assembly 使用cmpq和je时的无限循环

Assembly 使用cmpq和je时的无限循环,assembly,x86-64,decrement,cmp,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 有什么问题吗?我相信乘法的结

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


有什么问题吗?

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

问题是,您使用相同的寄存器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;
}