我在每次迭代时递减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。
可能是什么问题?
答案 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;
}