第三章 arm指令集
来源:互联网 发布:长三角师资招聘会 网络 编辑:程序博客网 时间:2024/05/22 06:49
arm指令集分为6类:跳转指令、数据处理指令、 程序状态寄存器(psr)传输指令、Load/store指令、 协处理器指令和异常中断产生指令。
3.1.1跳转指令
在arm中实现程序跳转:1、跳转指令 2、直接向pc 写入目标地址(再跳之前可mov lr,pc)
arm跳转指令(前后32MB):
1.b跳转指令
2.BL带返回的跳转指令
3.BLX 带返回和程序状态切换的跳转指令
4.bx带程序状态切换的跳转指令
3.1.2数据处理指令
数据指令分为:数据传送指令、算是逻辑运算指令、比较指令( 不保存运算结果,只影响CPSR中相应条件标志位)。
掩码值:目标值想设为1的位为1,其他为零
sbc r5,r1,r3 ;r5=r1-r3-c
rsb rd,rx,#0 ;rd=-rx(逆向减法指令)
rsb rd,rx,rx,lsl#n ;rd=rx*(2*n-1)
rsc r3,r1,#0 ;r3=0-r1(带位逆向减法指令)
and r3,#n ;r3=r3&n(逻辑与)
orr r3,r0,r3,lsl#8 ;逻辑或
eor r3,r0,r0,ror #16 ;orr指令可用于寄存器某些位的值取反,与0不变,与1取反
bic
BIC R0,R0,#0B111111
cmp r3,#5 比较指令
cmn(基于相反数比较指令)
tst r3,#n(通常用于测试寄存器中某个位是1还是0)
乘法指令
mul(mul 仅仅保存64位结果低32位)
mul r0,r1,r2 ;r0=r1*r2
muls r0,r1,r2 ;r0=r1*r2同时设置cpsr中n位和z位
mla r0,r1,r3,#4 ;r0=r1*r3+4
smull r1,r2,r3,r4 ;r1=r3*r4的低32位,r2=(r4*r3) 的高32位
smlal r1,r2,r3,r4 ;r1=r1+r3*r4的低32位,r2=r2+r3*r4的高32位
umull r1,r2,r3,r4 ;r1=r3*r4的低32位,r2=r3*r4的高32位
umlal r1,r2,r3,r4;r2 r1=r3*r4+r2 r1
杂类算术指令
clz rd,rm ;计算rm高位有多少个零存入rd中
状态寄存器访问指令
mrs 状态寄存器到通用寄存器的传送指令
mrs r1,cpsr or spsr
msr 通用寄存器到状态寄存器的传送指令
mrs r0,cpsp ;读取cpsr
bic r0,r0,#0x1f ;修改去除当前处理器模式
orr r0,r0,#0x13 ;修改,设置特权模式
msr cpsr_c,r0 ;写回仅仅修改cpsr中的控制域
3.1.6 lOAD/Store内存访问指令
LDR
1.用于从内存中读取32为字数据到通用寄存器, 然后可在该寄存器中对数据进行一定的操作
2.当pc作为指令的目标寄存器是,指令实现程序的跳转功能。
ldr r0,[r1,#4] ;将[r1+4]读取到r0寄存器中
ldr r0,[r1,r2,lsl #2] ;将[r1+r2<<2]读取到r0寄存器中
LDRB
1.用于从内存中读取一字节数据到通用寄存器中, 然后可在该寄存器中对数据进行一定的操作。
2.当pc为指令中的目标寄存器是,指令可以实现程序跳转的功能
LDRB R0,[R2,#3] ;将[R2+3]中的字节数读取到r0,r中高24为设置成0
LDRB R0,[R1] ;将【r1】中的字节数据读取到r0中,r0中高24位设置成0
LDRBT(用户模式的字节数据读取指令, 当在特权级的处理器模式下使用本指令是, 内存系统将该操作当作一般用户模式下的内存访问操作)
LDRH(半字读取指令)
用于从内存中将一个16为的半字数据读取到指令中的目标寄存器中 ,并将寄存器的高16位清零
LDRSB(有符号的字节数据读取指令)
从内存中将一个8位的字节数据读取到指令中的目标寄存器。。。。 。。。以后看代码又不懂的指令在看书把。
arm协处理指令
arm支持16个协处理器, 每个协处理器忽略属于arm处理器和其他协处理器的指令, 当一个协处理器硬件不能执行属于他的协处理器指令时, 将产生未定义指令一次中断
共有5条指令:
cdp 数据操作指令
ldc 数据读取指令
stc 数据写入指令
mcr arm寄存器到协处理寄存器的数据传送指令
mrc 协处理寄存器到arm寄存器的数据传送指令
CDP
ARM处理器用于通知arm协处理器执行特定的操作
CDP p5,2,c12,c10,c3,4 ;(2,4为操作码1.2;c12目标协处理器寄存器;c10, c3存放操作数协处理器寄存器)
LDC
从内存单元中将数据读取到协处理器的寄存器中
LDC p6,cr4,[r2,#4] ;r2为arm寄存器,指令读出内存单元r2+4的字数据, 传送到协处理器p6的cr4寄存器
STC
将协处理的寄存器中的数据写入到一系列连续的内存单元中, 失败产生未定义的指令异常中断
STC P8,CR8,[R2,#4];R2为arm寄存器将p8处理器的cr8中的字数据写入到([ r2]+4)
MCR
将arm处理器的寄存器中的数据传送到协处理器的寄存器中,
mcr p14,3,r7,c7,c11,6 ;
mrc
将协处理器寄存器中的数值传送到arm处理器的寄存器中
mrc p15,2,r5,c0,c2,4
3.2一些基本的arm指令功能段(算法)
- 第三章 arm指令集
- arm v8汇编指令
- ARM (二) arm指令分类及其寻址方式
- ARM指令集--移位指令
- ARM 指令集>>跳转指令
- ARM指令集 LDR指令
- ARM 指令集 比较指令
- arm指令集比较指令
- arm指令集分支指令
- ARM指令集
- ARM 指令集
- ARM指令集
- ARM 指令集
- ARM指令集
- ARM 指令集摘要
- ARM、THUMB指令集
- ARM指令集
- ARM汇编指令集
- 第七章 内存管理单元MMU
- (10)异常a
- 第二章arm分类及寻址方式
- 第一章
- LR(R14)寄存器
- 第三章 arm指令集
- 嵌入式软件工程师面试题
- 嵌入式linux c语言引用设计
- Foundation框架-数字对象的操作
- BASH SHELL
- te2440LCD控制寄存器参数代码
- linux lds 链接脚本转载
- 位置无关代码(PIC)的分析…
- 链接脚本,文字无关码,运行地址,…