作为家庭作业,我得到了一个递归C函数来计算需要转换为ARM汇编的整数分区。我对ARM汇编的了解:
1)R0
将保存调用的返回值
2)R1
、R2
和R3
是自变量寄存器
代码如下所示:
int count_partitions(int n, int m) {
if (n == 0)
return 1;
else if(n < 0)
return 0;
else if (m == 0)
return 0;
else
return count_partitions(n - m, m) + count_partitions(n, m - 1);
}
我相信我已经正确地完成了前3个if & else-if
语句,最后一个else
语句的逻辑是找到count_partitions(n,m-1),将其存储到堆栈中,然后找到count_partitions(n-m, m)
,并将其添加到我从堆栈中获得的前一个返回值中-但是我的代码似乎不工作?
我已经附上了我尝试的解决方案,并用颜色标记了不同的C代码段及其相应的汇编代码。有人能告诉我哪里出了问题吗?
2条答案
按热度按时间lf5gs5x21#
我想我看到了几个问题:
n
在r1
中,这实际上在r0
中,m
将在r1
中,而不是r2中。r0
和r1
。一个更干净的解决方案是使用类似这样的方法:
uqzxnwby2#
您可以在CMP命令之后使用此命令并跳转您的函数:
BEQ标签;分支机构相同
BNE标签;分支不相等
BLE标签;分支小于等于
BLT标签;分支小于
BGE标签;分支大于等于
BGT标签;分支大于