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;
}
此代码将输出 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
我目前在将 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 时遇到了困难。
您缺少 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