文章目录
- 上一篇
- ARM指令集概述
- ARM寻址方式
- 下一篇
上一篇
嵌入式系统复习–ARM技术概述
ARM指令集概述
ARM指令集是32位的,程序的启动都是从ARM指令集开始。
指令编码
=
第一操作数
+
第二操作数
+
目的操作数
+
条件影响标志位
+
不同功能实现的二进制位
指令编码 = 第一操作数 + 第二操作数 + 目的操作数 + 条件影响标志位 + 不同功能实现的二进制位
指令编码=第一操作数+第二操作数+目的操作数+条件影响标志位+不同功能实现的二进制位
- 根据CPSR中的条件位自动判断是否执行指令
- 最高的四位[31 : 28]是用来表示条件码(cond)的
- N为符号位,1负0正
- Z为结果为0位,1表示为0, 0表示不是
- C是进位位,加法进位位1,减法进位为0
- V是有符号溢出,溢出为1
重要的基本条件
ARM指令使用的基本格式:
- opcode操作码(指令助记符)如LDR、STR等
- cond可选条件码(上面的基本条件);也称为执行条件
- S表示是否修改标志位(加上会修改标志位CPSR)
- Rd目标寄存器
- Rn存放第一操作数的寄存器
- operand2 第2操作数
举例:
LDR R0, [R1] //读取R1地址上的存储器单元内容,加上[]表示存储器
BEQ DATAEVEN //条件执行分支指令,执行条件为EQ,表示相等的时候跳转到DATAENEN(标号)
ADDS R2, R1, #1 //加法指令,R2 <- R1 + 1,加上了S影响CPSR寄存器
SUBNES R2, R1, #0x20 //减法指令,当不相等NE的时候R2 <- R1 - 0x20结果影响CPSR寄存器
ARM寻址方式
-
立即寻址
操作数在指令里,可以立即获得操作数(也称立即数),以及数以#为前缀,加上“0x”的是十六进制数ADD R0, R0, #1 //R0 <- R0 + 1
参与运算的是32位立即数,由于位数不够全部放入,因此这个#给出的是压缩后的立即数
而这个存放方式是,采用8位的常数循环右移偶数位而间接得到,其中循环右移的位数由4位二进制的两倍表示,立即数记作,而8位常数记作immed_8, 4位的循环右移值记作rotate_imm
有 < i m m e d i a t e > = i m m e d _ 8 循环右移( 2 ∗ r o t a t e _ i m m ) <immediate> = immed\_8循环右移(2*rotate\_imm) <immediate>=immed_8循环右移(2∗rotate_imm)
一个立即数中非0以外的宽度在8以内就能通过移位表示出成32位
-
寄存器寻址
对应的数值在寄存器中ADD R0, R1, R2 //R0 <- R1 + R2
同时也有特殊之处,如果第二操作数是寄存器,则可以选择是否对第二操作数进行移位如果选择可以从(逻辑左移LSL(无符号数), 逻辑右移LSR, 算术左移ASL(有符号数), 算术右移ASR, 右循环移位ROR, 右循环拓扑(其中标志位C也参与移位用)RRX)分别表示中选择移位方式,移位位数可以选择第4个寄存器,也可以是5位的立即数
移位方法:
逻辑移位左右移都是补0
算术移位分为左移 右移 正 右侧补0 左侧补0 负 右侧补0 左侧补1 ADD R3, R2, R1, LSR #2 // R3 <- R2 + (R1 / 4)
-
寄存器间接寻址
以寄存器的值作为操作数的地址,而操作数本身存放在存储器中。LDR R0, [R1] // R0 <- [R1] STR R0, [R1] // [R1] <- R0
指向的是4个字节的地址,寻找对应操作数要根据对应大端小端存储来进行前后找
-
基址加偏址寻址
将寄存器(基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。
根据是先取指令还是先变址分为:- 前变址模式
LDR RO, [R1, #4] // R0 <- [R1 + 4]
- 自动变址模式
LDR R0, [R1, #4]! // R0 <- [R1 + 4]、 R1 <- R1 + 4
- 后变址模式
LDR R0, [R1], #4 // R0 <- [R1]、R1 <- R1 + 4
同时地址偏移量可以是立即数也可以寄存器,并且在加到基址寄存器前也可以进行移位操作。
LDR r0, [r1, r2] // r0 <- [r1 + r2] LDR r0, [r1, r2, LSL #2] // r0 <- [r1 + r2*4]
常用立即数的,寄存器形不常用
传输的数据类型,默认是选择字操作,但是可以通过增加后缀来进行字节(B)、半字(H)来进行操作
-
堆栈寻址
- 当堆栈指针指向最后压入堆栈的数据时,称为满堆栈,而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈。
- 当访问寄存器时,存储器的地址向高地址方向生长,称为递增堆栈。存储器地址向低地址方向生长,称为递减堆栈。决定堆栈指针是加1还是减1
将上述两种类型组合可以组合成4种;
-
块拷贝寻址
是多寄存器传送指令LDM/STM的寻址方式,他可以将存储器中的数据块加载到多个寄存器中,也可以把多个寄存器中的内容保存到存储器中,这多个寄存器可以是R0~R15这16个寄存器的子集或者所有寄存器,与堆栈的分类方式类似。
两种寻址方式的后缀;I:increase 、D:decrease、A:after、B:before、F:full、E:empty
例:ARM指令: STMFD SP! {R1 - R7, LR} : 入栈 LDMFD SP! {R1 - R7, LR}: 出栈 Thumb指令: PUSH {R1 - R7, LR} : 入栈 POP {R1 - R7, LR} :出栈
-
相对寻址方式
它是以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。BL即为指令符号BL NEXT // 跳转到子程序,子程序调用 ...... //到NEXT处执行,返回之后再从BL下一条指令开始执行 NEXT ...... MOV PC, LR //从子程序返回
下一篇
未完待续