递归C函数到ARM汇编的转换?

u91tlkcl  于 2023-03-01  发布在  其他
关注(0)|答案(2)|浏览(166)

作为家庭作业,我得到了一个递归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代码段及其相应的汇编代码。有人能告诉我哪里出了问题吗?

lf5gs5x2

lf5gs5x21#

我想我看到了几个问题:

  • 假设nr1中,这实际上在r0中,m将在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}
uqzxnwby

uqzxnwby2#

您可以在CMP命令之后使用此命令并跳转您的函数:
BEQ标签;分支机构相同
BNE标签;分支不相等
BLE标签;分支小于等于
BLT标签;分支小于
BGE标签;分支大于等于
BGT标签;分支大于

相关问题