ARM指令集(下)
A.2.5 ARM 协处理器指令
ARM 支持协处理器操作,协处理器的控制要通过协处理器命令实现。表A-7给出全部的ARM协处理器指令。
CDP
协处理器数据操作指令。ARM 处理器通过CDP 指令通知ARM
协处理器执行特定的操作。该操作由协处理器完成,即对命令的参数的解释与协处理器有关,指令的使用取决于协处理器。若协处理器不能成功地执行该操作,将产
生未定义指令异常中断。指令格式如下:
CDP{cond} coproc,opcodel,CRd,CRn,CRm{,opcode2}
其中: coproc 指令操作的协处理器名。标准名为pn,n 为0~15。
opcodel 协处理器的特定操作码。
CRd 作为目标寄存器的协处理器寄存器。
CRN 存放第1 个操作数的协处理器寄存器。
CRm 存放第2 个操作数的协处理器寄存器。
Opcode2 可选的协处理器特定操作码。
CDP 指令举例如下:
CDP p7,0,c0,c2,c3,0 ;协处理器7 操作,操作码为0,可选操作码为0
CDP p6,1,c3,c4,c5 ;协处理器操作,操作码为1
LDC
协处理器数据读取指令。LDC 指令从某一连续的内存单元将数据读取到协处理器的寄存器中。协处理器数据的数据的传送,由协处理器来控传送的字数。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:
LDC{cond}{L} coproc,CRd,<地址>
其中: L 可选后缀,指明是长整数传送。
coproc 指令操作的协处理器名。标准名为pn,n 为0~15
CRd 作为目标寄存的协处理器寄存器。
<地址> 指定的内存地址
LDC 指令举例如下:
LDC p5,c2,[R2,#4];读取R2+4指向的内存单元的数据,传送到协处理器p5的c2寄存器中
LDC p6,c2,[R1] ;读取是指向的内存单元的数据,传送到协处理器p6 的c2 寄存器中
STC
协处理器数据写入指令。STC 指令将协处理器的寄存器数据写入到某一连续的内存单元中。进行协处理器数据的数据传送,由协处理器来控制传送的字数。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:
STC{cond}{L} coproc,CRd,<地址>
其中: L 可选后缀,指明是长整数传送。
coproc 指令操作的协处理器名。标准名为pn,n 为0~15
CRd 作为目标寄存的协处理器寄存器。
<地址> 指定的内存地址
STC 指令举例如下:
STC p5,c1,[R0]
STC p5,c1,[Ro,#-0x04]
MCR
ARM 寄存器到协处理器寄存器的数据传送指令。MCR 指令将ARM 处理器的寄存器中的数据传送到协处理器的寄存器中。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:
MCR{cond} coproc,opcodel,Rd,CRn,CRm{,opcode2}
其中:coproc 指令操作的协处理器名。标准名为pn,n 为0~15。
cpcodel 协处理器的特定操作码。
CRD 作为目标寄存器的协处理器寄存器。
CRn 存放第1 个操作数的协处理器寄存器
CRm 存放第2 个操作数的协处理器寄存器。
Opcode2 可选的协处理器特定操作码。
MCR 指令举例如下:
MCR p6,2,R7,c1,c2,
MCR P7,0,R1,c3,c2,1,
MRC
协处理器寄存器到ARM 寄存器到的数据传送指令。MRC 指令将协处理器寄存器中的数据传送到ARM 处理器的寄存器中。若协处理器不能成功地执行该操作。将产生未定义异常中断。指令格式如下:
MRC {cond} coproc,opcodel,Rd,CRn,CRm{,opcode2}
其中:coproc 指令操作的协处理器名。标准名为pn,n为0~15。
opcodel 协处理器的特定操作码。
CRd 作为目标寄存器的协处理器寄存器。
CRn 存放第1 个操作数的协处理器寄存器。
CRm 存放第2 个操作数的协处理器寄存器。
opcode2 可选的协处理器特定操作码。
MRC 指令举例如下:
MRC p5,2,R2,c3,c2
MRC p7,0,R0,c1,c2,1
A.2.6 ARM 杂项指令
表A-8给出全部的ARM协处理器指令。
SWI
软中断指令。SWI 指令用于产生软中断,从而实现在用户模式变换到管理模式,CPSR保存到管理模式的SPSR 中,执行转移到SWI 向量,在其它模式下也可使用SWI 指令,处理同样地切换到管理模式。指令格式如下:
SWI{cond} immed_24
其中:immed_24 24 位立即数,值为0~16777215 之间的整数。
SWI 指令举例如下:
SWI 0 ;软中断,中断立即数为0
SWI 0x123456 ;软中断,中断立即数为0x123456
使用SWI 指令时,通常使用以下两种方法进行传递参数,SWI 异常中断处理程序就可以提供相关的服务,这两种方法均是用户软件协定。SWI 异常中断处理程序要通过读取引起软中断的SWI 指令,以取得24 位立即数。
(A)指令24 位的立即数指定了用户请求的服务类型,参数通过用寄存器传递。
MOV R0,#34 ;设置了功能号为34
SWI 12 ;调用12 号软中断
(B)指令中的24 位立即数被忽略,用户请求的服务类型由寄存器R0 的值决定,参数通过其它的通用寄存器传递。
MOV R0,#12 ;调用12 号软中断
MOV R1,#34 ;设置子功能号为34
SWI 0 ;
在SWI 异常中断处理程序中,取出SWI 立即数的步骤为:首先确定引起软中断的SWI指令是ARM 指令还时Thumb
指令,这可通过对SPSR 访问得到:然后要取得该SWI 指令的地址,这可通过访问LR 寄存器得到:接着读出指令,分解出立即数。
读出SWI 立即数:
T_bit EQU 0x20
SWI_Hander
STMFD SP!,{R0_R3,R12,LR} ;现场保护
MRS R0,SPSR ;读取SPSR
STMFD SP!,{R0} ;保存SPSR
TST R0,#T_bit ;测试T 标志位
LDRNEH R0,[LR,#-2] ;若是Thumb 指令,读取指令码(16 位)
BICNE R0,R0,#0xFF00 ;取得Thumb 指令的8 位立即数
LDREQ R0,[LR,#-4] ;若是ARM 指令,读取指令码(32 位)
BICNQ R0,R0,#0xFF00000 ;取得ARM 指令的24 位立即数
…
LDMFD SP!,{R0-R3,R12,PC}^ ;SWI 异常中断返回
MRS
读状态寄存器指令。在ARM 处理器中,只有MRS 指令可以状态寄存器CPSR 或SPSR读出到通用寄存器中。指令格式如下:
MRS{cond} Rd ,psr
其中: Rd 目标寄存器。Rd 不允许为R15。
psr CPSR 或SPSR
MRS指令举例如下:
MRS R1,CPSR ;将CPSR 状态寄存器读取,保存到R1 中
MRS R2,SPSR ;将SPSR 状态寄存器读取,保存到R2 中
MRS 指令读取CPSR,可用来判断ALU 的状态标志,或IRQ、FIQ 中断是否允许等;在异常处理程序中,读SPSR
可知道进行异常前的处理器状态等。MRS 与MSR 配合使用,实现CPSR 或SPSR
寄存器的读—修改---写操作,可用来进行处理器模式切换(),允许/禁止IRQ/FIQ
中断等设置。另外,进程切换或允许异常中断嵌套时,也需要使用MRS 指令读取SPSR 状态值。保存起来。
使能IRQ 中断例程:
ENABLE_IRQ
MRS R0,CPSR
BIC R0。R0,#0x80
MSR CPSR_c,R0
MOV PC,LR
禁能IRQ 中断例程:
DISABLE_IRQ
MRS R0,CPSR
ORR R0,R0,#0x80
MSR CPSR_c,R0
MOV PC,LR
MSR
写状态寄存器指令。在ARM 处理器中。只有MSR 指令可以直接设置状态寄存器CPSR或SPSR。指令格式如下:
MSR{cond} psr_fields,#immed_8r
MSR{cond} psr_fields,Rm
其中: psr CPSR 或SPSR
fields 指定传送的区域。Fields 可以是以下的一种或多种(字母必须为小写):
c 控制域屏蔽字节(psr[7…0])
x 扩展域屏蔽字节(psr[15…8])
s 状态域屏蔽字节(psr[23。…16])
f 标志域屏蔽字节(psr[31…24])
immed_8r 要传送到状态寄存器指定域的立即数,8 位。
Rm 要传送到状态寄存器指定域的数据的源寄存器。
MSR 指令举例如下:
MSR CPSR_c,#0xD3 ;CPSR[7…0]=0xD3,即切换到管理模式。
MSR CPSR_cxsf,R3 ;CPSR=R3
只有在特权模式下才能修改状态寄存器。
程序中不能通过MSR 指令直接修改CPSR 中的T 控制位来实现ARM 状态/Thumb 状态的切换,必须使用BX
指令完成处理器状态的切换(因为BX 指令属转移指令,它会打断流水线状态,实现处理器状态切换)。MRS 与MSR 配合使用,实现CPSR
或SPSR 寄存器的读-修改-写操作,可用来进行处理器模式切换、允许/禁止IRQ/FIQ 中断等设置。
堆栈指令实始化例程:
INITSTACK
MOV R0,LR ;保存返回地址
;设置管理模式堆栈
MSR CPSR_c,#0xD3
LDR SP,StackSvc
;设置中断模式堆栈
MSR CPSR_c,#0xD2
LDR SP,StackIrq
…
A.2.7 ARM 伪指令
ARM 伪指令不是ARM 指令集中的指令,只是为了编程方便编译器定义了伪指令,使用时可以像其它ARM
指令一样使用,但在编译时这些指令将被等效的ARM 指令代替。ARM 伪指令有四条,分别为ADR 伪指令、ADRL 伪指令、LDR 伪指令和NOP
伪指令。
ADR
小范围的地址读取伪指令。ADR 指令将基于PC 相对偏移的地址值读取到寄存器中。在汇编编译源程序时,ADR
伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD 指令或SUB 指令来实现该ADR
伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
ADR 伪指令格式如下:
ADR{cond} register,exper
其中:register 加载的目标寄存器。
exper 地址表达式。当地址值是非字地齐时,取值范围-255~255 字节之间;当地址是字对齐时,取值范围-1020~1020 字节之间。
对于基于PC 相对偏移的地址值时,给定范围是相对当前指令地址后两个字处(因为ARM7TDMI 为三级流水线)。
ADR 伪指令举例如下:
LOOP MOV R1, #0xF0
…
ADR R2, LOOP ;将LOOP 的地址放入R2
ADR R3, LOOP+4
可以用ADR 加载地址,实现查表:
…
ADR R0,DISP_TAB ;加载转换表地址
LDRB R1,[R0,R2] ;使用R2 作为参数,进行查表
…
DISP_TAB
DCB 0Xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
ADRL
中等范围的地址读取伪指令。ADRL 指令将基于PC 相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR
伪指令可以读取更大范围的地址。在汇编编译源程序时,ADRL 伪指令被编译器替换成两个条合适的指令。若不能用两条指令实现ADRL
伪指令功能,则产生错误,编译失败。ADRL 伪指令格式如下:
ADR{cond} register,exper
其中:register 加载的目标寄存器。
expr 地址表达式。当地址值是非字对齐时,取范围-64K~64K 字节之间;当地址值是字对齐时,取值范围-256K~256K 字节之间。
ADRL 伪指令举例如下:
ADRL R0,DATA_BUF
…
ADRL R1 DATA_BUF+80
…
DATA_BUF
SPACE 100 ;定义100 字节缓冲区
可以且用ADRL 加载地址,实现程序跳转,中等范围地址的加载:
…
ADR LR,RETURNI ;设置返回地址
ADRL R1 Thumb_Sub+1 ;取得了Thumb 子程序入口地址,且R1 的0 位置1
BX R1 ;调用Thumb 子程序,并切换处理器状态
RETURNI
…
CODE16
Thumb_Sub
MOV R1,#10
…
LDR
大范围的地址读取伪指令。LDR 伪指令用于加载32 位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR
伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV 或MVN 的范围,则使用MOV 或MVN 指令代替该LDR
伪指令,否则汇编器将常量放入字池,并使用一条程序相对偏移的LDR 指令从文字池读出常量。LDR 伪指令格式如下:
LDR{cond} register,=expr/label_expr
其中:register 加载的目标寄存器
expr 32 位立即数。
label_expr 基于PC 的地址表达式或外部表达式。
LADR 伪指令举例如下:。
LDR R0,=0x123456 ;加载32 位立即数0x12345678
LDR R0,=DATA_BUF+60 ;加载DATA_BUF 地址+60
…
LTORG ;声明文字池
伪指令LDR 常用于加载芯片外围功能部件的寄存器地址(32 位立即数),以实现各种控制操作加载32 位立即数:
…
LDR R0,=IOPIN ;加载GPIO 寄存器IOPIN 的地址
LDR R1,[R0] ;读取IOPIN 寄存器的值
…
LDR R0,=IOSET
LDR R1,=0x00500500
STR R1,[R0] ;IOSET=0x00500500
…
从PC 到文字池的偏移量必须小于4KB。与ARM 指令的LDR 相比,伪指令的LDR 的参数有“=”号
NOP
空操作伪指令。NOP 伪指令在汇编时将会被代替成ARM 中的空操作,比如可能为“MOV R0, R0”指令等,NOP 伪指令格式如下:
NOP
NOP
NOP
NOP
SUBS R1, R1, #1
BNE DELAY1
…
ARM指令集(下)的更多相关文章
- ARM指令集(上)
ADuC702x可以用两套指令集:ARM指令集和Thumb指令集.本小节介绍ARM指令集.在介绍ARM指令集之前,先介绍指令的格式. A.2.1 指令格式 (1)基本格式 ...
- ARM指令集相关知识
1.ARMv8引入了执行状态机制,分为AArch32和AArch64 AArch32为T32(Thumb)和A32(ARM). AArch64为A64一种指令集 A64和A32的指令都是32位宽,可以 ...
- ARM指令集——条件执行、内存操作指令、跳转指令
ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位.在数据处理指令中使用S后缀来实现该功能. 不要在CMP,CMN,TST ...
- 对arm指令集的疑惑,静态库运行,编译报错等问题
转载自http://www.jianshu.com/p/4a70aa03a4ea?utm_campaign=hugo&utm_medium=reader_share&utm_conte ...
- ARM指令集学习总结-转载
ARM指令集比较简单,本文介绍ARM指令集中需要注意和不易理解的地方. 一.ARM指令集是32位的,程序的启动都是从ARM指令集开始,包括所有异常中断都是自动转化为ARM状态,并且所有的指 ...
- ARM_Instruction_Set_Encoding_hacking(ARM指令集编码格式解读)
ARM指令集编码格式解读 说明: 1.本文参考的书籍<ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition>中的Cha ...
- 从最简单的实例学习ARM 指令集(三)
上一篇讲到赋值运算,这篇讲讲子函数调用.先看最简单范例:test4.c #include <stdio.h> void f1() { } void main() { int d = 4; ...
- ARM指令集—SWP指令
ARM指令集-SWP指令 SWP和SWPB是ARM指令集中对存储单元的原子操作.即对存储单元的一次读和一次不可被切割. SWP和SWPB分别完毕存储器和寄存器之间 一个字(32bit)和一个字节(8b ...
- ARM指令集、Thumb指令集、Thumb-2指令集
MCU使用什么指令集主要由内核决定的,比如Cortex-M3使用的是Thumb-2指令集 ARM指令集: 编代码全部是 32bits 的,每条指令能承载更多的信息,因此使用最少的指令完成功能, 所以在 ...
- 常用 ARM 指令集及汇编
ARM7TDMI(-S)指令集及汇编 ARM 处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制 较为简单,ARM7TDMI(-S)具有 32 位 ARM 指令集和 16 位 T ...
随机推荐
- Entity Framework 不支持DefaultValue
http://stackoverflow.com/questions/18506088/entityframework-not-updating-column-with-default-value Y ...
- VBA中自定义类和事件的(伪)注册
想了解一下VBA中自定义类和事件,以及注册事件处理程序的方法. 折腾了大半天,觉得这样的方式实在称不上“注册”,所以加一个“伪”字.纯粹是瞎试,原理也还没有摸透.先留着,有时间再接着摸. 做以下尝试: ...
- 将文件读取到内存、打印pe结构
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h&g ...
- albert1017 Linux下压缩某个文件夹(文件夹打包)
albert1017 Linux下压缩某个文件夹(文件夹打包) tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录例子:把 ...
- 通过EasyUI Tree说明SQL GUID和自增列ID的使用场景
最新在开发中用到了EasyUI里面的Tree,通过API可以看到这个Tree的数据格式如下: 其中ID比较重要,API也说了,最开始我考虑到GUID比自增ID多占用了一些空间,所以采用的自增ID,测试 ...
- Redis事务的分析及改进
Redis事务的分析及改进 Redis的事务特性 数据ACID特性满足了几条? 为了保持简单,redis事务保证了其中的一致性和隔离性: 不满足原子性和持久性: 原子性 redis事务在执行的中途遇到 ...
- monkey基本命令参数详解示例
Monkey基本命令参数 参数名 基本功能 举例 -p 参数-p用于约束限制,用此参数指定一个或多个包(Package,即App).指定 包之后,Monkey将只允许系统启动指定的APP.如果不指定包 ...
- 关于dom ready事件
0.加载完页面,解析完所有标签(不包括执行CSS和JS),并如规范中所说的设置 interactive 和执行每个静态的script标签中的JS,然后触发. 1.没有js,有css,有img,DOMC ...
- 表单美化-原生javascript和jQuery单选按钮(兼容IE6)
最近很多人问怎么美化表单的元素,大家都知道表单元素在各个浏览器中的表现不一,反正也是特别的丑,那么问题就来了,我们能自己设计表单元素的外观么?答案是可以的,现在我们就来试试吧.我们用两种方式来实现这一 ...
- http1.1和http1.0区别
http1.1和服务器建立连接可以获得多个资源 http1.0和服务器建立连接可以获取一个值