簡體   English   中英

C 嵌套循環到 ARM 組件

[英]C nested loop to ARM assembly

我目前在將 C 程序轉換為 ARM 程序集時遇到問題。 C程序如下:

int i = 1;
int j = 0;
int x = 0;

int main(){
    for( ; i < 10; i += 2){
        for( j = i; j < 10; j++){
            x += i + j;
        }
    }
    return x;
}

此代碼將為 output 240。

我目前擁有的如下:

.data

i:      .word   1
j:      .word   0
x:      .word   0

.text
.global main

main:
    LDR r6, addrJ
    LDR r5, addrI
    LDR r4, addrX
    LDR r3, [r6]
    LDR r2, [r5]
    LDR r1, [r4]
    b loop_outer

loop_outer:
    CMP r2, #10
    BGE done
    MOV r3, r2                      @ j = i
    loop_inner:
        CMP r3, #10             @ j < 10
        BGE inner_done
        ADD r1, r1, r2          @ x+=i
        ADD r1, r1, r3          @ x+=j
        ADD r3, r3, #1          @ j++
    inner_done:
        ADD r2, r2, #2          @ i+=2
        b loop_outer
        b done
done:
    MOV r0, r1
    bx lr

addrI: .word i
addrX: .word x
addrJ: .word j

此代碼當前輸出 50。我嘗試過自己調試,但我一直很難使用 GDB。

您缺少b loop_inner來重復內部循環。

並且不需要b done ,因為它在無條件b loop_outer之后,所以它永遠不會被執行。

loop_outer:
    CMP r2, #10
    BGE done
    MOV r3, r2                  @ j = i
    loop_inner:
        CMP r3, #10             @ j < 10
        BGE inner_done
        ADD r1, r1, r2          @ x+=i
        ADD r1, r1, r3          @ x+=j
        ADD r3, r3, #1          @ j++
        b loop_inner
    inner_done:
        ADD r2, r2, #2          @ i+=2
        b loop_outer
done:
    MOV r0, r1
    bx lr

暫無
暫無

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

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