为什么这个递归阶乘程序只 returns 我要计算的数字?

Why this recursive factorial program only returns the number that I want to calculate?

我在 ARM32 中做了这个简单的(不工作的)程序:

.global main

main:
    mov r0,#5    // 5 is the number that I want to calculate the factorial
    mov r1,r0

factorial:
    cmp r1,#1
    beq end
    sub r1,r1,#1    // n-1
    push {ip,lr}    // save the lr
    bl factorial
    mul r0,r1,r0    // multiply r0 * n-1
    pop {ip,lr}
end:
    bx  lr

如果我执行它,我得到 5,而不是 120。

$ ./a.out
$ echo $?
5        

为什么?

.global main

main:
    mov r0,#5    // 5 is the number that I want to calculate the factorial
    mov r1,r0

factorial:
    cmp r1,#1
    beq end
    sub r1,r1,#1    // n-1
    push {ip,lr}    // save the lr
    bl factorial
    mul r0,r1,r0    // multiply r0 * n-1
    pop {ip,lr}
end:
    bx  lr

遍历您的代码...

mov r0,#5  r0 = 5
mov r1,r0  r1 = 5
cmp r1,#1
beq end 
sub r1,r1,#1  r1 = 4
push
bl factorial
cmp r1,#1
beq end
sub r1,r1,#1 r1 = 3

你看到问题了吗?你现在应该已经看到了。

and this continues a few more times until
sub r1,r1,#1 r1 = 1
push
bl factorial
cmp r1,#1
beq end
bx lr
mul r0,r1,r0   r0 = 1 * 5 = 5
pop
bx lr
cmp r1,#1
beq end
bx lr
mul r0,r1,r0   r0 = 1 * 5 = 5
...

先尝试不使用递归,记住对于递归,在这种情况下,您需要一个每次调用都会更改的局部变量,如果您想使用单个值,则需要考虑将比较放置在何处或者如果你想使用两个,推送中的 ip 只是为了保持堆栈对齐所以请记住,因为你可以使用它来保存这些寄存器之一并在退出时恢复它。

请注意,从小学开始

4*3*2*1 = 1*2*3*4

在 Whosebug 上提问之前,您需要付出一些努力。

首先用 C 语言(或你更擅长的语言)编写和调试它,用 printfs 乱写代码,一旦你用你知道的语言编写算法,然后简单地 re-write 它用汇编语言或无论您正在学习什么新语言。