簡體   English   中英

將遞歸C函數轉換為ARM匯編?

[英]Conversion of recursive C function into ARM assembly?

對於一項家庭作業,我得到了一個遞歸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(nm, m) ,並將其添加到我從堆棧中獲得的上一個返回值-但是我的代碼似乎不起作用?

我已經附上了我嘗試過的解決方案,並對C代碼的不同段及其相應的匯編代碼進行了顏色編碼。 誰能讓我知道怎么了?

在此處輸入圖片說明

您可以在CMP命令之后使用此命令並跳轉功能:

BEQ標簽; 分支平等

BNE標簽; 分支不平等

BLE標簽; 分支機構少於平等

BLT標簽; 少於分支

BGE標簽; 分店比平等多

BGT標簽; 分支大於

我認為我看到了幾個問題:

  • 您假設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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM