跳转指令可以跳转到标号的下一条指令,本质就是修改了PC寄存器的值。(标号并非指令,只是用来定位,相当于记录了当前位置的下一条指令的地址)
@ 这里的MAIN就是一个标号
MAIN:
MOV R1, #1
@ 这里的FUNC就是一个标号
FUNC:
MOV R6, #2
目录
1、不带返回的跳转指令 B
2、带返回的跳转指令 BL
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;
}