[英]Conversion of recursive C function into ARM assembly?
對於一項家庭作業,我得到了一個遞歸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(nm, m)
,並將其添加到我從堆棧中獲得的上一個返回值-但是我的代碼似乎不起作用?
我已經附上了我嘗試過的解決方案,並對C代碼的不同段及其相應的匯編代碼進行了顏色編碼。 誰能讓我知道怎么了?
您可以在CMP命令之后使用此命令並跳轉功能:
BEQ標簽; 分支平等
BNE標簽; 分支不平等
BLE標簽; 分支機構少於平等
BLT標簽; 少於分支
BGE標簽; 分店比平等多
BGT標簽; 分支大於
我認為我看到了幾個問題:
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}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.