【问题标题】:C nested loop to ARM assemblyC 嵌套循环到 ARM 程序集
【发布时间】:2021-05-19 23:28:21
【问题描述】:

我目前在将 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 时遇到了困难。

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 哇.. 我花了一整天的时间看着这个。你是对的,我现在很讨厌自己..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多