ARM的总汇编指令Word格式.docx
- 文档编号:6229055
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:12
- 大小:549.03KB
ARM的总汇编指令Word格式.docx
《ARM的总汇编指令Word格式.docx》由会员分享,可在线阅读,更多相关《ARM的总汇编指令Word格式.docx(12页珍藏版)》请在冰点文库上搜索。
ADDEQR0,R0,#1
SUBNER0,R0,#1
汇编2
SUBSR1,R0,#10;
//S---运算的结果会影响条件码标志位:
CPSR:
NZCV
提示:
空指令NOP,实际上是占用CPU的时间,但是执行后,没有什么意义。
NOP----MOVR0,R0
3、条件码标识
10-10
Z=1
C=0
N=0
V=0
=================================================================================
二、ARM的寻址方式
1、立即数寻址
操作数,有立即数。
ADDR0,R0,#1
MOVR1,#10
ORRR1,R1,#0xfR1=R1|0xf
BICR1,R1,#0xfR1=R1&
(~(0xf))
错误:
ADDR1,#1,#2
注意:
立即数合法的条件
在ARM汇编指令中,并不是所有的立即数,立即数是有一定的限制的。
什么样的立即数是合法的?
?
1、如果一个立即数是小于256的(即该立即数是8bits以的,0~255),该立即数是合法的。
2、如果一个立即数是大于等于256,该立即数经过循环左移偶数位,可以得到一个小于256的数,则该立即数合法。
256=0x100------左移20位0x10000000----左移40x1合法
0x111非法
0x102非法
0x104合法
0xfff
0xff00
0x12000
0x450000
0xab
原因:
在数据处理指令编码的时候,立即数用12bits来表示:
高4bits:
循环左移左移偶数位除以2
低8bits:
循环左移后的结果。
重要问题:
ADDR1,R0,#0xffff非法
解决:
LDRR2,=0xffff//R2=0xffff,将立即数0xffff的值传送给R2
ADDR1,R0,R2
2、寄存器寻址
所有的操作数都是寄存器,没有立即数
ADDR0,R0,R1
MOVR1,R0
ORRR1,R1,R0R1=R1|0xf
BICR1,R1,R0R1=R1&
3、寄存器间接寻址
本质上,相当于C语言的指针
问题:
读取0x30008000地址下的容,该容是int型的?
inta;
a=*(int*)0x30008000
汇编:
LDRR0,=0x30008000
LDRR1,[R0]//LDR=loader,数据加载指令,加载一个地址下的容
STRR2,[R1]//STR---store,数据存储指令,将一个数据存放到一个地址下。
错误的写法:
LDRR1,[0x30008000]
间接寻址的地址需要存放到一个通用寄存器中,然后在使用。
4、寄存器的偏移寻址
MOVR0,R2,LSL#3//LSL—逻辑左移。
R0=R2<
<
3
ADDR0,R1,R2,LSL#4//R0=R1+(R2<
4)
SUBR0,R1,R2,LSLR3//R0=R1-(R2<
R3)
5、基址变址寻址
是一个间接寻址的变形,地址是由基地址和偏移量组成的
1)先变址
LDRR0,[R1,#4]//将R1+4作为新地址,将新的地址下的容加载给R0
2)后变址
LDRR0,[R1],#4//先将R1地址下的容加载给R0,然后R1=R1+4
3)自动变址
LDRR0,[R1,#4]!
//!
---》自动变址,将R1+4作为新地址,将新的地址下的容加载给R0;
然后R1=R1+4
6、栈的寻址
栈有四种寻址方式
对栈的操作:
STM--多个STR,一次可以完成多个数据的存储
LDM--多个LDR,一次可以完成多个数据的加载
例:
在操作满递减栈的时候:
出栈:
LDMFD
入栈:
STMFD
7、相对寻址
BLdelay
Bloop
三、ARM的汇编指令
1、跳转指令(B)---分支指令branch
B:
单纯的跳转
BL:
跳转的同时保存返回地址
BX:
带状态切换的跳转
BLX:
带状态切换的跳转,并保存返回地址
受跳转指令编码格式的限制,跳转的围是-32MB~32MB。
BLdelay//delay与跳转指令的不能超过32MB
注意,如果跳转的围超过32MB,使用:
LDRPC,=delay
2、数据处理指令
需要注意:
立即数合法的要求
1)传送指令
movR1,R0
movR2,#10
mvnR3,#10//将10取反,然后再传给R3
2)算术逻辑运算指令
ADDR1,R2,R0//R1=R2+R0
SUBR2,R1,#10//R2=R1-10
ORRR1,R1,#0xf//将R1的低四位置1,其它位保持不变
BICR2,R2,#0xf//将R2的低四位清0,其它位保持不变
ANDR3,R3,#0xf//保留R3的低四位,其它位都清0
EORR4,R4,#10//R4=R4^10
3)比较指令
CMPR0,#10//R0-10,然后根据运算的结果自动影响标志位
CMNR0,#10//R0+10,然后根据运算的结果自动影响标志位
TSTR0,#8//R0&
8,然后根据运算的结果自动影响标志位
TEQR0,#8//R0^8,然后根据运算的结果自动影响标志位
3、乘法指令和乘加指令
MULR3,R2,#10//R3=R2*10
MLAR2,R1,R0,#10//R2=R1*R0+10
4、存储器访问指令
根据存储器的地址访问该地址下的容:
LDRR1,[R0]//R0—存储器的地址
STRR2,[R0]
STMFDSP!
{R0-R8,LR}
LDMFDSP!
{R0-R8,PC}
SWPR2,R1,[R0]//通用寄存器和存储器之间的字类型数据交换
相当于:
LDRR2,[R0]
STRR1,[R0]
5、协处理器指令
在ARM核中,有一个协处理器(CP15),协处理器有16个寄存器C0~C15,我们对协处理器中寄存器进行访问的时候,使用的是协处理器指令,不能使用ARM汇编指令。
协处理器的作用:
设置MMU、设置cache、读取芯片的ID,设置ARM的大小端格式
6、软件中断指令
SWI:
ARM---linux的系统调用
7、通用寄存器和状态寄存器的访问指令
MRS:
将S(statusregister)move到R(register)中
MSR
MRSR0,CPSR
BICR0,R0,#0x80
MSRCPSR,R0
上面程序的目的:
将CPSR[7]清0,将所有的IRQ中断都打开。
四、ARM汇编伪指令
1、什么是伪指令
伪指令并不是真正的ARM汇编指令,当我遇到一些应用的时候,这些应用的场景并不能使用汇编指令实现,所以提出伪指令的概念。
伪指令相当于汇编指令的序列,一条伪指令在编译的时候,会被编译成一条或几条汇编指令。
伪指令相当于C语言的小函数。
2、LDR
1)ARM汇编指令
加载某地址上的数据。
如:
LDRR2,[R0]
2)ARM汇编伪指令
(1)传输不能使用mov来传递的立即数
MOVR1,#0xffff//非法
替代:
LDRR1,=0xffff
(2)获取一个标示符的地址,大围的
BLdelay//当delay与BLdelay指令,距离超过了32MB,跳不过去
替代:
LDRPC,=delay//围在4GB
3、NOP
是一个空指令,相当于MOVR0,R0,占用CPU的执行时间,没有作用。
nop指令占用的时间:
(1/MIPS)us
MIPS=998----(1/998)us
4、ADR
小围的地址读取指令,-1020~1020
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 总汇 指令