C 嵌套循环到 ARM 程序集

时间:2021-02-17 04:28:55

标签: c assembly raspberry-pi arm nested-loops

我目前在将 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;
}

此代码将输出 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 上遇到了困难。

1 个答案:

答案 0 :(得分:1)

您错过了重复内循环的 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