ARM汇编

最后更新于 2025-01-14 666 字 预计阅读时间: 3 分钟


通用寄存器

ARM 64包含31个64bit寄存器,记为X0~X30,32位寄存器为W0~W30。

  • X0~X7:八个寄存器用来存放函数调用的8个参数,其中X0还用来存放函数的返回值,若参数个数大于8,就采用栈来传递。
  • X29:Frame Pointer (FP),栈帧寄存器(等同于rbp),在每次进入函数时更新,用于记录每个函数的栈帧位置,方便函数操作变量和参数
  • X30:Link Register (LR),用来存储函数调用时的返回地址。在调用函数时会将下一条指令的地址放入X30寄存器

专用寄存器

ARM架构中的专用寄存器主要包括

  • 程序状态寄存器(CPSR)
  • 备份的程序状态寄存器(SPSRs)

其中SPSR是用来保存中断前的CPSR中的值

寻址方式

和x86架构一样,都采用[ ]来表示内存单元地址,采用LDR(load reg)和STR(store reg)来寻址

  • LDR W0,[addr] 读取32位的地址
  • LDR X0 ,[addr] 读取64位的地址
  • STRB W0,[addr] 将W0低8位的值放入addr中(byte)
  • STRH W0,[addr] 将W0低16位的值放入addr中(half word)
  • STRW W0,[addr] 将W0的值放入addr中(word)
  • LDR W0,[addr,#12] 变址寻址 ,将读取addr+12地址处32位的值给W0
  • LDR W0,[X1] 变址寻址 ,将读取X0所指地址处32位的值给W0
  • LDR W0,[X1,#1] ! 前变址寻址 ,更新X1为X1+1,再将读取X0所指地址处32位的值给W0
  • LDR W0,[X1], #1 后变址寻址 ,读取X1所指地址处32位的值给W0,再更新X1为X1+1

无条件转移和条件转移

无条件转移

  • B (Branch):无条件跳转到指定的标签位置。
  • BL (Branch with Link):跳转到指定位置并保存返回地址(PC+4)到链接寄存器(LR)。常用于函数调用。
  • BX (Branch and Exchange):跳转到寄存器中指定的地址,并根据地址的低位决定是使用 ARM 还是 Thumb 模式。可以实现函数的动态调用。
  • BLX (Branch with Link and Exchange):跳转并保存返回地址,且根据地址的低位决定使用 ARM 或 Thumb 模式。

条件转移

  • BEQ 相等
  • BNE 不等
  • BPL 非负
  • BMI 负
  • BCC 无进位
  • BCS 有进位
  • BLO 小于(无符号数)
  • BHS 大于等于(无符号数)
  • BHI 大于(无符号数)
  • BLS 小于等于(无符号数)
  • BVC 无溢出(有符号数)
  • BVS 有溢出(有符号数)
  • BGT 大于(有符号数)
  • BGE 大于等于(有符号数)
  • BLT 小于(有符号数)
  • BLE 小于等于(有符号数)

待更。。

此作者没有提供个人介绍。
最后更新于 2025-01-14