FORLOOP:
Lfunc_begin0:
@ BB#0:
sub sp, #4
movs r0, #1 //存放立即数1到寄存器r0
Ltmp0:
str r0, [sp] //把r0中的数据传给sp
LBB0_1: @ =>This Inner Loop Header: Depth=1
movw r0, #50000 //存放立即数1到寄存器r0(即if条件里面的比较值5000)
Ltmp1:
ldr r1, [sp] //将sp的数据传给r1
adds r1, #1 //r1的数据自加1
str r1, [sp] //将r1的数据传给sp
Ltmp2:
ldr r1, [sp] //将sp的数据传给r1
Ltmp3:
cmp r1, r0 //比较 r1 和r0的数值(i++ 50000) (i++ 是否)
bne LBB0_3 //bne指令含义:如果比较结果不相等,就跳转。 本例中如果 i++ 和 5000不相同就跳转至LBB0_3步骤,如果相等就继续往下执行Ltmp4
@ BB#2:
Ltmp4:
b LBB0_4 //跳转至步骤LBB0_4
Ltmp5:
LBB0_3: @ in Loop: Header=BB0_1 Depth=1
b LBB0_1 //跳转至步骤LBB0_1
Ltmp6:
LBB0_4:
add sp, #4 //sp中的值加4
bx lr //等同于 MOV PC, LR (LR为链接寄存器有两种含义:
1:保存子程序的返回地址,使用BL或BLX时,跳转指令自动把返回地址放入r14中,子程序通过把r14复制到PC来实现返回
2:当异常发生时用来保存异常的返回地址,可以处理嵌套中断) 本段指令意思是跳转到程序的返回地址,即结束程序
Ltmp7:
Lfunc_end0:
WHILELoop
Lfunc_begin0:
@ BB#0:
sub sp, #4
movs r0, #1 //存放立即数1到寄存器r0
Ltmp0:
str r0, [sp] //把r0中的数据传给sp
LBB0_1: @ =>This Inner Loop Header: Depth=1
movw r0, #50000 //存放立即数1到寄存器r0(即if条件里面的比较值5000)
Ltmp1:
ldr r1, [sp] //将sp的数据传给r1
adds r1, #1 //r1的数据自加1
str r1, [sp] //将r1的数据传给sp
Ltmp2:
ldr r1, [sp] //将sp的数据传给r1
Ltmp3:
cmp r1, r0 //比较 r1 和r0的数值(i++ 50000) (i++ 是否)
bne LBB0_3 //bne指令含义:如果比较结果不相等,就跳转。 本例中如果 i++ 和 5000不相同就跳转至LBB0_3步骤,如果相等就继续往下执行Ltmp4
@ BB#2:
Ltmp4:
b LBB0_4 //跳转至步骤LBB0_4
Ltmp5:
LBB0_3: @ in Loop: Header=BB0_1 Depth=1
b LBB0_1 //跳转至步骤LBB0_1
LBB0_4:
add sp, #4 //sp中的值加4
bx lr //等同于 MOV PC, LR (LR为链接寄存器有两种含义:
1:保存子程序的返回地址,使用BL或BLX时,跳转指令自动把返回地址放入r14中,子程序通过把r14复制到PC来实现返回
2:当异常发生时用来保存异常的返回地址,可以处理嵌套中断) 本段指令意思是跳转到程序的返回地址,即结束程序
Ltmp6:
Lfunc_end0:
FORLoop 和 WHILELoop 区别在于 :LBB0_3 后紧接着有个Ltmp6