ARM汇编

ARM简介

架构

  • ARMv1: ARM1处理器
  • ARMv2: ARM2/ARM3
  • ARMv3: ARM6/ARM7
  • ARMv4: StrongARM/ARM7TDMI/ARM9TDMI
  • ARMv5: ARM7EJ/ARM9E/ARM10E/XScale
  • ARMv6: ARM11/Cortex-M
  • ARMv7: Cortex-A/Cortex-M/Cortex-R
  • ARMv8: Cortex-A30/A50/A70等

大小端与浮点

大端(Big-endian): 最高有效位(MSB)在前
小端(Little-endian): 最低有效位(LSB)在前

硬件浮点(Hard Float): 通过浮点单元(FPU)实现和专用的浮点寄存器传参,计算精度高、速度快
软件浮点(Soft Float): 通过算法实现,适用于没有浮点运算单元的处理器

ABI (Application Binary Interface):ABI定义了编译后的程序如何与操作系统、库以及硬件进行交互。它包括:

  • 数据类型的大小、对齐方式(如int是4字节)。
  • 函数调用的约定:参数如何传递(通过寄存器还是栈?),返回值如何传递,谁负责清理栈。
  • 系统调用的方式
  • 浮点运算的处理方式:这是区分armelarmhf的关键。

例如:
armel(ARM Embedded ABI, Little Endian):软件浮点小端序
armhf(ARM Hard-Float ABI):硬件浮点小端序
arm64:64位ARM默认采用硬件浮点,无需hf后缀

ARM应用场景

Cortex-A系列

  • 特点: 高性能、高交互性
  • 应用: PC、平板、手机等需要复杂功能的设备

Cortex-M系列

  • 特点: 低功耗、低成本
  • 应用: 传感器、水表、跑步机等简单工业设备,通常运行RTOS而非完整Linux系统

Cortex-R系列

  • 特点: 实时高性能
  • 应用: 硬盘控制器等对实时性要求极高的场景

ARM运行

运行模式

运行模式通过指令操纵特殊寄存器达到模式切换

共有9种运行模式

模式类别 模式名称 模式作用及特点
用户模式 USR模式 基本特性:ARM处理器正常程序执行状态,所有应用程序默认运行在此模式
权限限制:属于非特权模式,对系统资源访问受限
中断处理模式 FIQ模式 快速中断模式,进入FIQ中断异常,中断也会分类,除了硬件中断还有软件中断,中断的时候也会有消息传过来,这个消息可能数据量比较大,而且要求还很大,还有的消息数据量比较小,它要求就会很小,这种要求大的中断我们就称为快速中断,比较小的我们就称为一般中断
用于高速数据传输或通道处理,配备更多寄存器(R8-R14)以加速大量数据中断处理
IRQ模式 一般中断模式
处理通用中断请求,仅使用R13-R14寄存器,适合数据量较少的中断场景
系统管理模式 SVC(Supervisor)模式 操作系统保护模式,具有最高权限,可执行reset等特权操作
超级管理员,它主要是用来管理调用指令被执行或者reset的时候,这个模式的权限级别非常大,所以一般情况下是不能随便用的
ABT(Abort)模式 退出模式,通常开始发生了用户级别的开始,就会出现这样的退出,这个时候CPU就会说暂停下面的代码运行,就直接退出
在数据/指令预取终止时触发,支持虚拟存储和存储保护
SYS(System)模式 系统模式,当系统自己异常的时候,就会发生这样的模式,它有一个特点就是可以进行各个模式的切换,在不同的状态的时候,访问的寄存器就有可能不一样,这个模式用到的寄存器与用户模式是共享的,只是访问级别不一样
运行特权操作系统任务,与用户模式共享寄存器但具有更高权限
异常处理模式 UND(Undef)模式 执行未定义指令时进入,提供错误诊断信息
比如说一条指令是CPU不识别的,就叫做未定义
MON(Monitor)模式 安全扩展模式,监控程序异常行为,主要用于虚拟化环境
监视模式,就像后台服务,就像监测网络信号,其实CPU不需要去处理一些用户中断,这个模式主要用来安全扩展模式,只用于安全
Hyp模式 虚拟化模式,非安全状态下的虚拟化专用模式
是一个超级的监视者,它比超级管理员要稍微低一点,它主要是用来做一些虚拟化的扩展

工作状态

ARM状态

32位字对准指令,执行效率更高

进入Thumb状态:
1.执行BX指令,并将操作数寄存器的状态(位[0])为1
2.在Thumb状态进入异常返回时自动转换(所有异常处理默认为ARM状态,当异常处理返回时自动转换Thumb指令)

ARM工作状态寄存器:

寄存器类型 寄存器 作用
通用寄存器 R0-R7 所有模式共享
R8-R12 FIQ模式独占(R8_fiq-R12_fiq)
专用寄存器 R13(SP) 模式专属栈指针(如R13_abt)
R14(LR) 保存子程序返回地址
R15(PC) 程序计数器,所有模式共享
状态寄存器 CPSR 当前程序状态寄存器,包含条件标志、中断控制等关键位
SPSR 保存的程序状态寄存器,异常发生时自动备份CPSR内容

Thumb状态

16位半字对准指令,代码密度更高

进入ARM状态:
1.执行BX指令,并将操作数寄存器的状态(位[0])为0
2.进入异常时,将PC放入异常模式链接寄存器中,从异常向量地址开始执行也可进入ARM状态

Thumb工作状态寄存器:
寄存器精简:仅使用R0-R7、SP、LR、PC寄存器,不使用R8-R12

ARM流水线操作

CPU流水线是把一条指令分为多个处理阶段

三级流水线(ARMV7)

取指(Fetch):从存储器读取指令
译码(Decode):解析指令操作和操作数
执行(Execute):完成算术逻辑运算

PC指向Fetch

五级流水线(ARMV9)

取指(Fetch)
译码(Decode)
执行(Execute)
存储器访问(Memory)
写回(Writeback)

ARM指令集

格式:指令{条件}{S} 目的寄存器,源操作数1,源操作数2

条件:缺省时无条件执行
B(byte)功能不变,操作长度变为8位
H(half word)功能不变,长度变为16位
S(signed)功能不变,操作数变为有符号

S标志:决定是否影响CPSR标志位,当没有S时指令不更新CPSR标志位的值

一个仍在爬山的人