ARM汇编基础

本文最后更新于 2025年9月24日 晚上

ARM汇编基础

基础

CPU、寄存器、内存、指令的关系

CPU用于处理各种指令,寄存器用于暂时存放各种指令所需要的参数,内存相当于一个大寄存器,用于长期存储指令所需要的各种数据

ARM架构家族

ARM Architecture (ARMv7,ARMv8,ARMv6-M等):是一套指令集架构(ISA),定义了基本的指令,寄存器,异常模型和内存模型

Cortex Series:基于架构实现的具体处理器核心设计

特性 Cortex-A**(Application)** Corter-M**(Microcontroller)** Cortex-R (Real-time)
运行的OS Linux,Android,Windows FreeRTOS, Zephyr, μC/OS RTOS (有MPU)
架构版本 ARMv7-A,ARMv8-A,ARMv9-A ARMv6-M, ARMv7-M, ARMv8-M ARMv7-R, ARMv8-R
核心特征 有内存管理单元(MMU) 无MMU,有MPU (内存保护单元) 有MPU,强调高实时性
应用举例 手机、平板、电视 IoT传感器、智能家居设备、穿戴设备、电机控制 硬盘控制器、汽车刹车系统、通信基带

ARM状态与Thumb状态

ARM状态

指令集:执行ARM指令集

指令长度:32位,4个字节长度

Thumb状态

指令集:执行Thumb指令集

指令长度:每条指令是16,2个字节长度

特点:

1.代码密度高:其大小是ARM代码的65%,极大降低存储成本

特性 ARM 状态 传统 Thumb 状态 Thumb-2 技术
架构版本 ARMv4T 及之后 ARMv4T 至 ARMv5TE ARMv6T2, ARMv7 及之后
指令长度 32位 16位 混合:16位 & 32位
代码密度 低 (~100%) 高 (~65%) 很高 (~74%), 接近纯Thumb
性能 较低 非常高,接近纯ARM
主要应用 早期高性能应用 极致追求代码密度的v5/v6设备 现代主流:Cortex-A, R, M系列
状态切换 需要与Thumb切换 需要与ARM切换 在Cortex-M上无状态概念,只有一种模式

大端小端

小端:低位字节存放在低地址

1
2
3
4
#逆顺序
0x78563412
最高位:0x78
最低位:0x12

大端:低位字节存放在高地址

1
2
3
4
#正顺序
0x12345678
最高位:0x12
最低位:0x78
特性 小端模式 (Little-Endian)(当前主流) 大端模式 (Big-Endian)
存储顺序 低位字节在低地址 高位字节在低地址
人类可读性 反直觉,需从后往前读 直观,与书写顺序一致
主流架构 Intel x86, ARM (默认) 网络字节序, Motorola 68k

静态分析

寄存器专题

R0-R3:参数/结果寄存器

功能:用于向函数传递前4个参数,如果参数超过4个,多余的会通过栈传递,R0在函数返回时,通常用于存放函数的返回值

R4-R8,R10-R11:变量寄存器

功能:用于函数内部的局部变量,如果一个函数要使用他们比如使用前保存其值(压入栈),并在函数返回前恢复原值

R7:帧指针,指向栈帧底部

R9:取决具体ABI,可能是变量寄存器,也可以有其他用途

R12:内部过程调用临时寄存器

R13:栈指针SP,指向栈帧顶部

R14:又叫LR(Link Register),用于保存函数的返回地址

R15:PC,程序计数器,指向下一条执行的指令

指令集专题

数据传输指令

1
2
3
4
5
6
7
8
9
10
11
12
13
#Mov 简单理解为复制
MOV R0,R1 #R0=R1
MOV R0,42 #R0=42

#LDR:加载,从内存读取数据到寄存器
LDR R0,[R1] #[]代表把寄存器中值当作一个内存地址,然后去访问
LDR R0,[R1,4] #是基址偏移模式,R0=*(R1+4)
LDR R0,[R1,4]! #前变址模式,先变化地址,在加载,R1=R1+4,R0=*R1
LDR R0,[R1],4 #后变址,R0=*R1+4

#STR:存储,把寄存器中的数据写入内存
STR R0,[R1] #R0的值存储到R1指向的内存地址
其他与LDR类似

算数运算指令

1
2
3
4
#ADD/SUB/MUL/AND/ORR/EOR 加/减/乘/与/或/异或
ADD R0,R1,R3 # R0=R1+R3
ADD R0,R1,10, #R0=R1+10

比较与分支命令

1
2
3
4
5
6
7
8
9
10
#CMP:比较指令,其实是相减是否为0
CMP R1,R2 #R1-R2是否为0

#分支指令
BEQ label # 相等时跳转
BNE label # 不等时跳转
BGT label # 大于时跳转
BLT label # 小于时跳转
BGE label # 大于等于时跳转
BLE label #

ARM汇编基础
http://example.com/2025/09/13/ARM汇编基础/
作者
清风
发布于
2025年9月13日
许可协议