本文主要是介绍ARMV8 - A64 - 跳转和返回指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
说明
- C语言等高级语言,根据是否需要返回到触发跳转代码的下一条代码,跳转有两种语句:
- 不需要返回,例如:if,goto,switch,while等语句。
- 需要返回,例如:函数调用,系统调用,SMC调用等。
- A64汇编指令跳转也一样。
只跳转,不需要返回
- B指令
- 跳转到某地址执行,无法返回。
- 一般是函数内跳转,类似于C语言中while循环,if else等语句导致的跳转。
- 示例:
int test(int a, int b)
{if (a) {return 0;}return a+b;
}* 对应汇编代码
test:sub sp, sp, #16str w0, [sp, 12] //将实参a保存到栈对应地址str w1, [sp, 8] //将实参b保存到栈对应地址ldr w0, [sp, 12] //从栈中将变量a load到寄存器w0中cmp w0, 0 //对应上面的if 判断 w0(变量a)是否为0beq .L4 // 为0,跳转到标签 .L4mov w0, 0 // 不为0,将w0赋值为0b .L5 //不为0,跳转到 .L5,对应return 0
.L4: //对应 a+b;ldr w1, [sp, 12]ldr w0, [sp, 8]add w0, w1, w0
.L5: // 对应 returnadd sp, sp, 16ret
- BR指令
- 跳转到某寄存器保存的地址处运行,无法返回。
br x20 //跳转到通用寄存器x20指向地址运行
跳转后,需要返回
- 跳转和返回是不同的指令,返回时,需要主动调用返回指令。
- 指令详细动作如下:
- 跳转指令,先将下一条指令的地址(即返回后执行的起始地址)保存到通用寄存器 lr (x30)中,再跳转目标地址。
- 返回指令,跳转到x30寄存器所保存的地址执行。
跳转指令
- BL指令
- 跳转到某地址执行,运行完可以返回。
- 一般用于不同函数的跳转,类似于C语言中的函数调用,如:
- 语法
bl 0x100cfa754
- 示例
int test()
{return 0;
}int main()
{test();return 0;
}* 对应汇编
test:mov w0, 0ret
main:stp x29, x30, [sp, -16]!add x29, sp, 0bl test1mov w0, 0ldp x29, x30, [sp], 16ret
- BLR指令
- 跳转到某寄存器保存的地址处运行,运行完可以返回。
br x20 //跳转到通用寄存器x20指向地址运行
返回指令
- ret
- 主动调用后,跳转到x30寄存器所保存的地址执行。
- 语法
ret
这篇关于ARMV8 - A64 - 跳转和返回指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!