arm的汇编指令精选合辑
子集从存储器读取以及存储到存储中。
PUSH和POP指令使用堆栈指针(R13)作为基址实现满递减堆栈。除可传送R0~R7外,PUSH还可以用于存储连接寄存器,POP可以用于读取程序指针。
Tuhmb指令主要有以下几类指令组成:Tuhmb Load/Store类指令;Thumb数据运算类指令;Thumb转移类指令,以及软件中断指令。
3.3.1 Thumb Load/Store类指令
1 Thumb单寄存器Load/Store指令
Thumb单寄存器传送类指令是ARM单寄存器传送类指令的一个子集,和ARM有相同的指令格式。
Thumb单寄存器传送指令分以下4种:
(1) LDR和STR—立即数偏移
功能:读取寄存器和存储寄存器。寄存器的地址用一个寄存器的数偏移量指明,立即数偏移的半字和字节读取是无符号的。
格式:
<操作码>Rd,[Rn,《#immed_5*N》]
<操作码>包括:LDR,LDRB,STR,STRH和STRH指令
其中:
H 指明无符号半字传送。
B 指明无符号字节传送
RD 读取和存储寄存器。Rd必须在R0—R7范围内
RN 基址寄存器.Rn必须在R0—R7范围内
Immed_5*N 偏移量。Immed_5是一个表达式,其中值在0--31范围内,在汇编时结果是的N倍数。
对字节传送,N=1
对半字传送,N=2az
对字传送, N=4
注释:
字传送的地址必须可被4整除,半字传送的地址必须可被2整除。
若系统中有系统协处理器(CP15),则可允许对准检查。若允许对准检查,则非对准的传送会引起对准异常
若系统没有协处理系统器(CP15)或禁止对准检查,则:
非对准读取使Rd不可靠
非对准存使存储器的2个或4个字节不可靠。对半字存储,不可靠的存储器位置是address AND NOT 0x1; 于字存储器,则是address AND NOT 0x3
例:
LDR R3,[R5,#0] ;(R5)→R3
STRB R0,[R3,#3] ;(R0)→((R3)+31)
STRH R7,[R3,#16] ;(R7)→((R3)+16)
LDRH R2,[R4,#Label—{PC}]
(2) LDR和STR---寄存器偏移
功能:读取寄存器和存储寄存器。存储器的地址用一个寄存器的基于寄存器偏移指明存储器地址。
格式:
《操作码》Rd,[Rn,Rm]
《操作码》是下列情况之一:
读取寄存器,4字节字
存储寄存器,2字节字
读取寄存器,2字节无符号半字
读取寄存器,2字节字有符号半字,有符号位扩展(即高位字节与符号字节相同)
存储寄存器,2字节半字
读取寄存器,无符号半字
读取寄存器,有符号半字,有符号位扩展(即高位字节与符号位相同)
存储寄存器,字节
含偏移量的寄存器,Rm必须在R0~R7范围内
注释:
同3.3.1节第1条指令。
例:
LDR R2,[R1,R5]; ((R1)+(R5))---R2
STRH R0,[R0,R1]; (R0)---((R0)+(R1))
STRB R1,[R7,R0]; (R1)---(R7)+(R0)
(3) LDR----PC相对偏移
功能:读取寄存器和存储器。存储器中的地址用中内容的立即数偏移指明。字节码结构:
格式:
LDR Rd,[PC,#immed_8*4]
LDR Rd,Label
其中:
immed_8*4偏移量。它是一个表达式,取值(在汇编时)为4的整数倍,范围在0~1020内。
Label 程序相对偏移表达式。必须在当前指令之后且范围内。
注释:
同3.3.1节第1条指令
例:+
LDR R2,[PC,#1016]; ((PC)+1026)---R2
LDR R5,localdata
(4) LDR和STR---SP相对偏移
功能:读取寄存器和存储寄存器。存储器的地址用中内容的立即数偏移指明。
格式:LDR Rd,[SP,#immed_8*4]
STR Rd,[SP,#immed_8*4]
其中:
immed_8*4
偏移量。它是一个表达式,取值(在汇编时)为4的整数倍,范围在0~1020内。
注释:
同3.3.1节第1条指令。
例:
LDR R0,[SP,#920]; ((SP)+920)---R0
STR R1,[SP,#20]; (R1)---(SP)+20
2 Thumb多寄存器指令
功能:Load和多个Store寄存器
格式:(1)LDMIA Rn!, 《Reglist》 (2)STMIA Rn!,《Reglist》
其中:
Reglist 低寄存器或低寄存范围的,用逗号隔开的列表。列表中至少有一个寄存器。
Rn 目的寄存器,必须是低于寄存器
注释:
(1)寄存器以数字顺序取或存储。最低数字的寄存器在的初地址中。的值以中寄存器个数的4倍增加。
(2)若在Rn寄存器列表中,则
对于LDMIA指令,Rn的最终值是读取的值,不是增加后的地址。
对于STMIA指令,Rn的终值有如以下两种情况:
---若是寄存器列表中最低的寄存器,则的存储值为初值;
---其他情况则不可预知。
例:
LDMI
- 什么是LED驱动时序?LCD背光驱动程序设计(04-26)
- LCD驱动的移植及其GUI仿真如何进行,LCD数模转换现实原理及其源代码(04-25)
- wince代码写入LCD驱动参考,数码产品怎样分别是不是LCD坏点(04-26)
- ARM微处理器助记符指令及其功能描述(04-30)
- 布线工程师如何充分“掌控”时钟信号?(02-21)
- FPGA组成、工作原理和开发流程(10-13)