对于家庭作业,我已经获得了一个递归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代码的不同部分及其相应的汇编代码进行了颜色编码。谁能让我知道什么是错的?
答案 0 :(得分:0)
您可以在CMP命令后使用它并跳转功能:
BEQ标签; BRANCH EQUAL
BNE标签;分支不等于
BLE标签;分支比平等
BLT标签;分支比
少BGE标签;分支大于等于
BGT标签;分支大于
答案 1 :(得分:0)
我想我看到了几个问题:
n
位于r1
。这实际上在r0
。 m
将在r1
,而不是r2。r0
和r1
。一个更清洁的解决方案是使用这样的东西:
_count_partitions:
... ; First part with comparison
; but r1->r0 and r2->r1
push {r4-r5}
mov r4, r0 ; saved value of n
mov r5, r1 ; saved value of m
sub r0, r4, r5 ; n = n-m
bl _count_partitions
sub r1, r5, #1 ; m = m-1
mov r5, r1 ; result of first function
mov r0, r4 ; restore n
bl _count_partitions
add r0, r0, r5 ; cumulative result
pop {r4,r5}
pop {pc}