跳转指令可以跳转到标号的下一条指令,本质就是修改了PC寄存器的值。(标号并非指令,只是用来定位,相当于记录了当前位置的下一条指令的地址)
- @ 这里的MAIN就是一个标号
- MAIN:
- MOV R1, #1
-
- @ 这里的FUNC就是一个标号
- FUNC:
- MOV R6, #2
目录
1、不带返回的跳转指令 B
所谓不带返回,指的是,跳转之前不会保存跳转位置的下一条指令地址,跳转过去就回不来了。
指令格式:B <标号/具体地址>
- MAIN:
- MOV R1, #1
- MOV R2, #2
- B FUNC @ 通过标号跳转
- MOV R3, #3
-
- FUNC:
- MOV R4, #4
- MOV R5, #5
从LR寄存器的值来看,说明指令 B 在跳转之前不会保存下一条指令的地址。
2、带返回的跳转指令 BL
BL指令就恰恰相反,在跳转之前,BL指令会自动将下一条指令的地址保存到LR寄存器。
指令格式:BL <标号/具体地址>
- MAIN:
- MOV R1, #1
- MOV R2, #2
- BL FUNC @ 通过标号跳转
- MOV R3, #3
-
- FUNC:
- MOV R4, #4
- MOV R5, #5
- MOV PC, LR @ 把LR寄存器的值赋给PC寄存器
注意:跳转过去以后,不会自动跳回来,需要手动将LR寄存器的值赋给PC寄存器才能跳转回来。
从调试结果来看,BL在跳转之前确实保存了下一条指令的地址。
对应C语言,就类似于
- void func(){
- int d = 4;
- int e = 5;
- }
-
- int main(){
- int a = 1;
- int b = 2;
- func();
- int c = 3;
- }
评论记录:
回复评论: