ARM相关汇总
ELF文件格式
- 枚举一些必要的点
段名 | 作用 |
---|---|
.text | 代码段,可读 & 可执行,不可写 |
.rodata | 只读数据段(常量字符串等),只读 |
.data | 已初始化的全局/静态变量,可读可写 |
.bss | 未初始化的全局/静态变量,可读可写 |
.plt | 过程链接表(PLT),用于动态链接 |
.got | 全局偏移表(GOT),可读可写 |
.dynamic | 动态链接信息 |
.stack | 栈,一般是 RW,某些情况下可能是 RWX |
.heap | 堆,通常是 RW,但可能变成 RWX(如 JIT 编译器) |
延迟绑定机制——PLT & GOT
二者主要用来解决动态库函数调用和全局变量访问的问题
通常来讲plt表中的每个入口通常指向GOT表中的一个地址,负责跳转
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)