1)
ARM指令集 32位的 ARM指令和 16位 的Thumb指令
1,寄存器寻址
MOV R1, R2
//将寄存器R2的值传给寄存器R1
2,立即寻址
MOV R0, #0XFF00 //数据包含在指令中
3,寄存器偏移寻址
MOV R0, R2, LSL #3 //R2的值左移3位,结果放入 R0中 即 R0 = R2 * 8
LSL逻辑左移、 LSR逻辑右移、 ASL算术左移、 ASR算术右移、 ROR循环右移、RRX带扩展的循环右移
4,寄存器间接寻址
LDR R1, [R2] //将R2中的数值作为地址,取出此地址的数据保存在R1中
SWP R1,R1,[R2] //将R2中的数值作为地址
5,基址寻址 将基址寄存器的内容与指令中给出的偏移量相加,形成有效地址
LDR R2,[R3, #0x0F] //将R3中数值加0x0F作为地址,取出数据保存在R2中
LDR R0, [R1], #-4 //将R1地址单元内容存入R0中,且R1= R1 - 4
STR R1, [R0, #-2]
//将R0中数值减2作为地址,
6,多寄存器寻址
LDMIA R1!, {R2-R7, R12}
//将R1单元的数据读出到R2-R7,R12中,R1自动加1
STMIA R0!,{R3-R6,R10}
//将R3-R6中德数据保存到R0指向的地址,R0自动加1
7,堆栈寻址
满递增 LDMFA STMFA
满递减 LDMFD STMFD
空递增 LDMEA STMEA
空递减 LDMED STMED
8,块拷贝寻址 多寄存器传送指令用于一块数据从存储器的某一位置拷贝到另一位置
STMIA R0!,{R1-R7}
STMIB R0!, {R1-R7}
STMDA
STMDB
9,相对寻址
由程序计数器PC提供基准地址,指令中地址码字段作为偏移量,两者相加都得到的地址即为操作数的有效地址
带S的会影响CPSR寄存器,标志位
R15 为程序计数器PC。
2)ARM存储器访问指令
ARM处理器是加载/存储体系结构的典型RISC处理器,对存储器的访问只能使用加载和存储指令实现。LDR/STR
批量加载和存储指令可实现一条指令加载/存储多个寄存器的内容,大大提高了效率。SWP指令是一条寄存器和存储器
内容交换的指令,可用于信号量操作等。ARM处理器是冯诺依曼存储结构,程序空间、RAM空间及IO映射空间统一编址,
除对RAM操作外,对外围IO、程序数据的访问均要通过加载/存储指令进行。
||LDR/STR T为可选后缀,有T表示处理器在特权模式下,使用后缀!表示结果回写。S表示带符号扩展。
B后缀表一个字节, H表示半字(2字节),
||程序相对偏移 LDR Rd, label; //label为程序标号,必须是当前指令的+-4KB范围内
1,LDM 和 STM 可以实现一组寄存器和一块连续的内存单元之间传输数据。主要用于现场保护、数据复制、参数传递等。
IA 传送后地址加4 DA 传送后地址减4
IB 传送前地址加4 DB 传送前地址减4
STMFD R0!,{R0-R7,LR} //现场保存 将R0-R7,LR入栈
LDMFD R1!,{R0-R7,PC} //恢复现场 异常处理返回
2,SWP
寄存器和存储器交换指令,用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另
一个寄存器Rm的内容写入到该内存单元中。
SWP R1, R2, [R0] //将R0指向存储单元内容读取一字节到R1中(高24位清零),并将R2内容写入该内存单元
3)ARM跳转指令
B label 跳转指令 Pc<-label 限制在当前指令的+-32KB的范围内
BL label 带链接的跳转指令 LR<- PC-4, PC<- label 用于子程序调用
BX Rm
带状态切换的跳转指令 PC<- label切换状态
4)ARM协处理器指令
1,CDP 通知ARM协处理器执行特定的操作
2,LDC 从某一连续的内存单元将数据读取到协处理器的寄存器中
LDC p5, c2, [R2, #4] //读取R2+4指向内存单元的数据传送到协处理器p5的c2寄存器中
3,STC 将协处理器的寄存器数据写入到某一连续的内存单元中
4,MCR 将ARM处理器的寄存器中的数据传送到协处理器的寄存器中。
5,MRC 将协处理器的寄存器中的数据传送到ARM处理器的寄存器中。
5)ARM杂项指令
SWI immediately——24 软中断指令 处理器进入管理模式
MRS Rd, psr 读状态寄存器指令
MSR psr_fields, Rd/#immed_8r 写状态寄存器指令
6)ARM伪指令
ADR伪指令 小范围的地址读取伪指令,用于将PC相对偏移的地址值读取到寄存器中。
ADRL伪指令 中等范围的地址读取伪指令,用于将PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。
LDR伪指令 大范围的地址读取伪指令,用于加载32位的立即数或一个地址到指定寄存器中。
NOP伪指令 空操作伪指令
ARM汇编程序由机器指令,
伪指令和宏指令组成,伪指令不像机器指令那样在处理器运行期间由机器执行,而是由汇编程序
对源程序处理。
1)符号定义伪指令
GBLA全局的算术变量初始化为0
LCLA 局部的 SETA 赋值
GBLL全局的逻辑变量初始化为false
LCLL 局部的
SETL 赋值
GBLS全局的字符串变量初始化空 LCLS 局部的
SETS 赋值
ARM处理器共有
37个寄存器。其中包括:
**
31
个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器。
**
6
个状态寄存器。这些寄存器也是32位寄存器。
ARM处理器共有7种不同的处理器模式,每一种模式中都有一组相应的寄存器组。在任何时刻,可见的寄存器包括15个通用寄存器
(R0-R14),一个或两个状态寄存器及程序计数器(PC)。在所有的寄存器中,有些是各模式公用一个物理寄存器,有一些寄存
器各模式拥有自己独立的物理寄存器。
****************************************************
通用寄存器 ARM
通用寄存器分为以下三类:备份寄存器、未备份寄存器、程序计数器PC
备份寄存器
对于R8-R12备份寄存器来说,每个寄存器对应两个不同的物理寄存器。系统为将备份寄存器用于任何的非凡用途,但是
当中断处理非常简单,仅仅使用R8-R14寄存器时,FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中
断处理非常迅速。 ARM
对于R13,R14备份寄存器来说,每个寄存器对应六个不同的物理寄存器,其中的一个是系统模式和用户模式共用的;另外
的五个对应于其他的五种处理器模式。采用下面的记号来区分各个物理寄存器:
R13_<MODE> 字串5
其中MODE可以是下面几种模式之一:usr,svc,abt,und,irq,fiq
字串5
未备份寄存器
未备份寄存器包括R0-R7。对于每一个未备份寄存器来说,所有处理器模式下都是使用同一个物理寄存器。未备份寄存器
没有被系统用于非凡的用途,任何可采用通用寄存器的场合都可以使用未备份寄存器。
程序计数器PC
可以作为一般的通用寄存器使用,但有一些指令在使用R15时有一些限制。由于ARM采用了流水线处理器机制,当正确读取
了PC的值时,该值为当前指令地址值加上8个字节。也就是说,对于ARM指令集来说,PC指向当前指令的下两条指令的地址。
由于ARM指令是字对齐的,PC值的第0位和第一位总为0。
需要注意的是,当使用str/stm保存R15时,保存的可能是当前指令地址值加8个字节,也可能保存的是当前指令地址值加12
个字节。到底哪种方式取决于芯片的具体设计。对于用户来说,尽量避免使用STR/STM指令来保存R15的值。
当成功的向R15写入一个数值时,程序将跳转到该地址执行。由于ARM指令是字对齐的,写入R15的值应满足bits[1:0]为0b00
,具体要求arm个版本有所不同:
**对于arm3以及更低的版本,写入R15的地址值bits[1:0]被忽略,即写入r15的地址值将与0xFFFF FFFC做与操作。
**对于ARM4以及更高的版本,程序必须保证写入R15的地址值bits[1:0]为0b00,否则将产生不可预知的后果。
对于Thumb指令集来说,指令是班子对齐的,处理器将忽略bit[0]。