Assembly 使用cmpq和je时的无限循环
我在每次迭代中递减RAX。如果RAX为零,则程序应更改流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 有什么问题吗?我相信乘法的结
# 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;
}