Arm汇编第一讲Arm寄存器与七种模式两种状态

Arm学习第一讲 Arm寄存器与模式

一丶Arm寄存器

1.1 什么是寄存器

​ 寄存器(register) 学过windows逆向的都知道.在汇编中同样有寄存器的概念. 寄存器是CPU的一个组成部分,里面放着指令丶数据丶和地址等相相关资源给CPU使用. 而他们的速度是很快的. 在windows x86汇编下. 速度分别就是

eax > ecx > ebx > edx ... 等. 寄存器速度比内存块. 又分为通用寄存器.以及专用寄存器.

  • 通用寄存器

​ 通用寄存器一般看名字就知道是通用的.它的功能就是完成通用的就算功能,谁都可以使用.

  • 专用寄存器

​ 专用寄存器一般特征有特别用处的寄存器. 如: 记录状态的状态寄存器 记录下一条执行指令的寄存器. 栈寄存器等. 是不可以随便修改的.

二丶Arm寄存器运行模式

2.1 Arm寄存器运行模式

​ 在学习Arm汇编的时候.首先说一下Arm寄存器的运行模式,为什么要说一下运行模式. 原因在于Arm寄存器在各个模式下有单独的不同的名字以及含义.这个需要了解.

  • 用户模式(USR)

Arm处理器正常的程序执行状态,在windows中我们就理解为是应用程序.是ring3程序

  • 快速中断模式(FIQ)

高速数据传输或者通道处理

  • 外部中断模式(IRQ)

通用的中断处理,一般就是系统发生中断的时候,Arm所运行的环境.

  • 管理模式(SVC)

操作系统使用的保护模式

  • 数据访问终止模式(ABT)

当数据或者指令预取终止的时候进入该模式,可用于虚拟存储以及存储保护.

  • 系统模式(SYS)

运行具有特权的操作系统任务 相当于内核模式. x86下的ring0

  • 未定义指令终止模式(UND)

当未定义的指令执行的时候进入该模式

以上数据模式 暂时只需要了解USR即可.

2.2Arm中寄存器介绍

​ 在Arm汇编中.有 37个寄存器 其中 31个通用的. 6个状态寄存器

然后在31 个通用寄存器中又分为 未分组寄存器分组寄存器

  • 未分组寄存器

​ 见名之意 未分组的意思在各个运行模式下都是可以使用的.通用的寄存器.

他们分别是 R0~R7

  • 分组寄存器

​ 所谓分组寄存器,指的就是在不同的模式下有不同的寄存器

例如sp_und 而在abort(ABT) 模式下就叫做 sp_abt,反正就是进入不同的模式下会自动进行切换.

R8-R12 寄存器很特殊,只有在快速模式下(FIQ)名字才不一样

  • R13寄存器

​ R13寄存器一般称为栈指针,在用户模式与系统模式下 一般就代表SP栈顶指针的意思 而在其它模式下

则叫做sp_x 这里的后缀 X 特指某一种模式下的后缀名. 如在UND模式下. 那么就叫做sp_und

在FIQ模式下就叫做 sp_FIQ

  • R14寄存器

​ R14寄存器也叫作LR寄存器(链接寄存器) 通常作用就是保存子程序或者中断的返回的地址.

除了 USR(用户模式) 和 SYS(系统模式) 其它模式都叫做LR_X (x还是特指的意思)

  • R15寄存器(PC)

​ R15寄存器也叫作PC寄存器 总是执向正在取值的指令. 学过x86汇编的应该知道.这个

寄存器就类似于x86平台下的EIP寄存器

  • CPSR(状态寄存器)

当前程序状态的CPSR寄存器. 类似于x86下的EFLAGS寄存器

2.3各个模式下的一览图

下列表格就代表各个平台下的寄存器名称.可做参考.

系统和用户模式 管理模式 终止模式 中断模式 未定义模式 快速中断模式
R0 R0 R0 R0 R0 R0
R1 R1 R1 R1 R1 R1
R2 R2 R2 R2 R2 R2
R3 R3 R3 R3 R3 R3
R4 R4 R4 R4 R4 R4
R5 R5 R5 R5 R5 R5
R6 R6 R6 R6 R6 R6
R7 R7 R7 R7 R7 R7
R8 R8 R8 R8 R8 R8_FIQ
R9 R9 R9 R9 R9 R9_FIQ
R10 R10 R10 R10 R10 R10_FIQ
R11 R11 R11 R11 R11 R11_FIQ
R12 R12 R12 R12 R12 R12_FIQ
R13_SP R13_SVC R13_ABT R13_IRQ R13_UND R13_FIQ
R14_LR R14_SVC R14_ABT R14_IRQ R14_UND R14_FIQ
R15(PC) R15(PC) R15(PC) R15(PC) R15(PC) R15(PC)
CPSR CPSR CPSR CPSR CPSR CPSR
SPSR_SVC SPSR_ABT SPSR_IRQ SPSR_UND SPSR_FIQ

2.54状态寄存器

​ 状态寄存器,一般就是保存程序执行过程中的一些状态. 比如 计算是否进位. 是否溢出.等.

状态寄存器如下表示

|N|Z|C|V|.......|I|F|T|MODE|

状态寄存器只用到了 0-4位(MODE0 4-8位(IFT) 以及28-31位(NZCV n是第31位)

0-4位称为ModeBits 是用来定位我们的CPU所运行的模式

4 - 8 表示 打断标志位(Interrupt Disable bits) 表示是否关中断

作用如下

Interrupt Disable bits 作用
I 7位: 如果为1则表示关闭IRQ
F 6位: 如果F = 1则表示关闭FIQ

其中比较特殊的就是第五位 T

如果T = 1 则表示我们的程序运行在 Arm状态

如果T = 0 则表示我们的程序运行在 thumb状态

下面会说明什么是Arm状态,什么是Thumb状态

其中第28-31位 表示条件代码状态标志位作用如下

Condition Code Flags(条件代码标志) 位数以及作用(31-28位)
N (Negative result from ALU flag) 31位: 表示运算结果是否为负.为负数则是1 否则就是0
Z (Zero result from ALU flag) 30位: 表示运算结果是否为0.如果为0就是1 否则就是0
C (ALU operation Carried Out) 29位: 表示进位标志 加减运算有没有进位有就是1否则就是0
V (ALu operation oVerflowed) 28位: 表示溢出位. 计算结果有没有溢出,溢出了就是1否则就是0

2.4 Arm运行状态 Arm&Thumb状态

​ 在Arm汇编中,他有七种运行模式 两种运行状态

两种运行状态分别是 ARM 以及 Thumb状态

  • Thumb状态

这个状态是16位指令 也就是2个字节 ArmV4版本后,假如的一种16位指令模式. 可以看做是ARM指令压缩形式的子集,具有16位的代码密度(也就是2个字节指令长度),但是只能是支持通用功能,必要的时候仍然需要ARM 指令.

Thumb-2 技术则扩充了受限的16位thumb 指令集. 以及额外的32位指令,使指令集的使用更加广泛.

下面是两种状态下寄存器的对应表

Thumb状态 Arm状态
R0-R7(通用寄存器)与ARM相等 R0-R7
CPSR (同上) CPSR
FP(栈底指针) R11(栈底指针)
IP R12
SP(栈顶) R13
LR(保存返回地址指令) R14
PC(当前指令) R15
posted @ 2021-06-29 23:28  Android_IBinary  阅读(729)  评论(0编辑  收藏  举报