【发布时间】:2020-09-09 15:42:39
【问题描述】:
我在 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
为什么?
【问题讨论】:
-
当您到达
n == 1并开始进行所有乘法运算时,您已经设置了r1 = 1。您可能应该在堆栈上保存并恢复它。 -
使用调试器单步执行您的代码,以查看寄存器值如何变化。并考虑一下您的递归函数接受并传递给子调用的 2 个参数到底是什么。以及传递 2 个参数对于阶乘实现是否有效。
-
你现在应该已经完成了这个作业,你会在这门课上挣扎。非递归版本发生了什么?
标签: recursion assembly arm factorial