0%

ARM相关汇总

  • ARM相关汇总


ELF文件格式

  • 枚举一些必要的点
段名 作用
.text 代码段,可读 & 可执行,不可写
.rodata 只读数据段(常量字符串等),只读
.data 已初始化的全局/静态变量,可读可写
.bss 未初始化的全局/静态变量,可读可写
.plt 过程链接表(PLT),用于动态链接
.got 全局偏移表(GOT),可读可写
.dynamic 动态链接信息
.stack 栈,一般是 RW,某些情况下可能是 RWX
.heap 堆,通常是 RW,但可能变成 RWX(如 JIT 编译器)

延迟绑定机制——PLT & GOT

ARM寄存器

寄存器 & 处理模式

寄存器 功能说明
R0 - R12 通用寄存器,用于存储操作数、局部变量、返回值等
R13 (SP) 堆栈指针:用于指向当前堆栈的顶部
R14 (LR) 链接寄存器:存储函数调用时的返回地址。调用函数时,返回地址存储在LR中
R15 (PC) 程序计数器:存储下一条要执行的指令的地址
CPSR 当前程序状态寄存器:存储处理器的状态信息,包括标志位,以及当前模式
SPSR 保存程序状态寄存器:用于存储异常或中断发生时的CPSR值,通常在进入异常模式时使用
Q0 - Q15 SIMD寄存器:用于单指令多数据(SIMD)运算,通常用于浮点运算和向量处理,支持浮点运算、媒体和信号处理
FPSCR 浮点状态控制寄存器:用于控制浮点操作的状态和异常
处理器模式 描述 常用寄存器
用户模式 普通用户程序运行的模式 R0 - R12, SP, LR, PC, CPSR
系统模式 特权模式,通常用于操作系统核心 R0 - R12, SP, LR, PC, CPSR
IRQ模式 用于处理中断请求 R0 - R12, SPSR, LR, SP, PC
FIQ模式 用于处理中断请求的快速响应 R0 - R7(保留),R8 - R12, SPSR, SP, PC
异常模式 处理特权异常的模式 R0 - R12, SPSR, SP, PC

状态寄存器(CPSR/SPSR)

标志位 描述
N 负标志(Negative Flag):结果为负时设置。
Z 零标志(Zero Flag):结果为零时设置。
C 进位标志(Carry Flag):用于无符号数运算中的进位或借位。
V 溢出标志(Overflow Flag):用于有符号数运算中的溢出。
I 中断禁止位(IRQ Disable):设置为1时禁用IRQ中断。
F 快速中断禁止位(FIQ Disable):设置为1时禁用FIQ中断。
T Thumb状态位(Thumb Mode):如果设置为1,则执行Thumb模式指令集。

ARM汇编指令

尽量…简洁?默认有x86汇编基础

指令名称 作用
b 无条件跳转
bl 带链接器的无条件跳转,可以理解为x86的call指令,该指令一般也是用于调用函数
bne 检查零标志位,如果ZF=0(即操作数不相等),它会执行跳转
beq 检查零标志位,如果ZF=1(即操作数相等),它会执行跳转
br 基于寄存器的无条件跳转,例如:br x8
ldr常规 ldr <寄存器>, [<基址寄存器>]
ldr带偏移 ldr <寄存器>, [<基址寄存器>, <偏移量>]
ldr立即数偏移 ldr <寄存器>, [<基址寄存器>, #<立即数>]
ldr预索引 ldr <寄存器>, [<基址寄存器>, #<偏移量>]!
ldr加载常量 ldr <寄存器>, =<常量>
str str <寄存器>, [<基址寄存器>],当然,同上ldr
stp 将两个寄存器的值同时存储到内存中
stp stp <寄存器1>, <寄存器2>, [<基址寄存器>, <偏移量>]
csel csel <目标寄存器>, <条件寄存器1>, <条件寄存器2>, <条件码> —— 1-成立 2-不成立
cset 基于条件设置目标寄存器的值。如果条件成立,则将目标寄存器的值设置为 1,否则设置为 0。通常用于根据条件标志位设置布尔值或标志寄存器

常见条件码:

eq: 相等(ZF = 1)

ne: 不相等(ZF = 0)

lt: 小于(负数标志为 1)

le: 小于或等于(零标志或负数标志为 1)

gt: 大于(零标志未被设置,负数标志未被设置)

ge: 大于或等于(负数标志为 0)