ARMV8 - A64 - 跳转和返回指令

说明

  • C语言等高级语言,根据是否需要返回到触发跳转代码的下一条代码,跳转有两种语句:
  1. 不需要返回,例如:if,goto,switch,while等语句。
  2. 需要返回,例如:函数调用,系统调用,SMC调用等。
  • A64汇编指令跳转也一样。

只跳转,不需要返回

  1. B指令
  • 跳转到某地址执行,无法返回。

  • 一般是函数内跳转,类似于C语言中while循环,if else等语句导致的跳转。

  • 示例:

    int test(int a, int b)
    {
    if (a) {
    return 0;
    }

    复制代码
      return a+b;

    }

    • 对应汇编代码
      test:
      sub sp, sp, #16
      str w0, [sp, 12] //将实参a保存到栈对应地址
      str w1, [sp, 8] //将实参b保存到栈对应地址
      ldr w0, [sp, 12] //从栈中将变量a load到寄存器w0中
      cmp w0, 0 //对应上面的if 判断 w0(变量a)是否为0
      beq .L4 // 为0,跳转到标签 .L4
      mov w0, 0 // 不为0,将w0赋值为0
      b .L5 //不为0,跳转到 .L5,对应return 0
      .L4: //对应 a+b;
      ldr w1, [sp, 12]
      ldr w0, [sp, 8]
      add w0, w1, w0
      .L5: // 对应 return
      add sp, sp, 16
      ret
  1. BR指令
  • 跳转到某寄存器保存的地址处运行,无法返回。

    br x20 //跳转到通用寄存器x20指向地址运行

跳转后,需要返回

  • 跳转和返回是不同的指令,返回时,需要主动调用返回指令。
  • 指令详细动作如下:
  • 跳转指令,先将下一条指令的地址(即返回后执行的起始地址)保存到通用寄存器 lr (x30)中,再跳转目标地址。
  • 返回指令,跳转到x30寄存器所保存的地址执行。

跳转指令

  1. BL指令
  • 跳转到某地址执行,运行完可以返回。

  • 一般用于不同函数的跳转,类似于C语言中的函数调用,如:

  • 语法

    bl 0x100cfa754

  • 示例

    int test()
    {
    return 0;
    }

    int main()
    {
    test();
    return 0;
    }

    • 对应汇编
      test:
      mov w0, 0
      ret // 返回到 bl test 下一条指令执行
      main:
      stp x29, x30, [sp, -16]!
      add x29, sp, 0
      bl test //跳转到 test 函数地址执行
      mov w0, 0
      ldp x29, x30, [sp], 16
      ret
  1. BLR指令
  • 跳转到某寄存器保存的地址处运行,运行完可以返回。

    br x20 //跳转到通用寄存器x20指向地址运行

返回指令

  1. ret
  • 主动调用后,跳转到x30寄存器所保存的地址执行。

  • 语法

    ret

相关推荐
女神下凡7 小时前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
NamoAmitabha1289 小时前
ARM Cortex-A9 核心架构(演化后的“缝合怪”)--deepseek
arm开发·zynq--ps
AllData公司负责人12 小时前
AllData 可定义数据中台完成信创适配|银河麒麟 + 海光X86 CPU / 华为鲲鹏ARM CPU+ OceanBase / 人大金仓国产化环境部署落地
大数据·arm开发·数据库·人工智能·oceanbase·kingbase
a5986522 天前
ARM服务器搭建云手机靠谱吗?个人自建方案优缺点总结
服务器·arm开发·智能手机·云手机
jiecy2 天前
在 ARM 的 UOS 系统里布署 WebDav
arm开发·docker·debian
女神下凡2 天前
芯参谋(87):Linux 系统(SPI NOR)驱动开发指南
linux·运维·arm开发·驱动开发·嵌入式硬件·设计规范
水饺编程2 天前
第2章:Linux 基础,解压缩【.tar.bz2】压缩包文件
linux·c语言·汇编
Zevalin爱灰灰2 天前
Linux入门第二部分(ARM裸机篇) 第二章 Cortex-A7 MPCore架构与ARM汇编基础
linux·汇编·arm开发·嵌入式
Zevalin爱灰灰2 天前
Linux入门第二部分(ARM裸机篇) 第三章 汇编LED驱动实验
linux·汇编·arm开发
女神下凡3 天前
芯参谋(83):AliOS Things_驱动开发指南
arm开发·驱动开发·单片机·嵌入式硬件·设计规范·1024程序员节