将递归C函数转换为ARM汇编程序?

时间:2016-04-19 08:48:49

标签: c recursion assembly arm

对于家庭作业,我已经获得了一个递归C函数来计算我需要转换为ARM程序集的整数分区。我对ARM程序集的了解:

1)R0将保留通话的返回值

2)R1R2R3是参数寄存器

代码如下:

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代码的不同部分及其相应的汇编代码进行了颜色编码。谁能让我知道什么是错的?

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以在CMP命令后使用它并跳转功能:

BEQ标签; BRANCH EQUAL

BNE标签;分支不等于

BLE标签;分支比平等

BLT标签;分支比

BGE标签;分支大于等于

BGT标签;分支大于

答案 1 :(得分:0)

我想我看到了几个问题:

  • 您认为n位于r1。这实际上在r0m将在r1,而不是r2。
  • 因此,您需要同时保存r0r1

一个更清洁的解决方案是使用这样的东西:

_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}