补坑计划——ARM(一)

来源:互联网 发布:儒尼尼奥任意球数据 编辑:程序博客网 时间:2024/04/25 14:54

开始进入移动安全这个坑的时候,并没有好好看ARM汇编。依靠x86的基础和ARM手册,各种博客上零星的知识点外加搜索引擎也就这么过来了。最近想稍微抽空重新过一遍ARM汇编,查漏补缺,或者应该算女娲补天。。。


处理器工作模式

用户模式(usr):正常的程序执行状态

快速中断模式(fiq):用于高速数据传输或者通道处理

外部中断模式(irq):用于通用的中断处理

管理模式(svc):保护模式

中断模式(abt):当指令或者数据预取终止时进入,用于虚拟存储及存储保护

未定义指令模式(und):当未定义的指令执行时进入该模式,用于支持硬件协处理器的软件仿真(后半段看不懂)

系统模式(sys):具有特权的操作系统任务


处理器工作状态

ARM状态:执行32位的ARM指令集

Thumb状态:执行16位Thumb指令集


ARM寄存器

31个通用寄存器,6个状态寄存器

最多可有18个活动寄存器(16个数据寄存器和2个处理器状态寄存器)


通用寄存器

R0~R15

1、未分组寄存器:

R0~R7,在所有工作模式下,都指向同一个物理寄存器

2、分组寄存器:

R8~R14,每一次所访问的物理寄存器与处理器的工作模式有关


R8~R12对应两个不同的物理寄存器,fiq状态下使用Rx_fiq,其他状态下Rx_usr

R13和R14各对应6中不同的物理寄存器,用户模式和系统模式共用,其他状态下各一个。

R13常用做堆栈指针,用户也可以使用其他寄存器作为堆栈指针,在Thumb指令集中,某些指令强制使用R13做堆栈指针。

由于每种状态各有一个R13,在应用程序初始化部分,一般初始化每种模式的R13,相当于分配了不同模式的栈空间,便于保存程序运行状态。

R14作子程序连接寄存器,或连接寄存器LR。当执行BL子程序调用时,得到PC寄存器的备份。当发送中断或异常时,对应的分组寄存器保存R15的返回值。

3、程序寄存器

R15


状态寄存器

ARM体系有一个当前程序状态寄存器CPSR(R16)和5个备份的程序状态寄存器(SPSRs)。



Thumb寄存器

Thumb状态下寄存器是ARM状态下子集,可直接访问R0~R7、PC(R15)、SP(R13)、LR(R14)和CPSR



指令格式

<opcode>  {<cond>} {S} <Rd> , <Rn> {, <OP2>}

<>必不可少,{}可选

<opcode>指令符

{<cond>}执行条件

{S}是否影响状态寄存器

<Rd>目的寄存器

<Rn>第一个操作数,为寄存器

<OP2>第二个操作数,可以是立即数、寄存器和寄存器移位操作符


指令可选后缀

S后缀,条件标志位将会刷新,如是否溢出,是否进位

SUB R1,R0,R3
R0减R3,结果保存到R1

SUBS R1, R0,R3
R0减R3,结果保存到R1,影响标志位


! 后缀,基址寄存器中的地址值发生变化

LDR  R3,[R0,#4]
R0加4做地址指针,将数据保存到R3

LDR  R3,[R0,#4] !
R0加4做地址指针,将数据保存到R3,R0的值变为原值加4

0 0
原创粉丝点击