arm的汇编指令精选合辑
的保存处理器状态格多字节传送的有效方式。ARM硬件中的堆栈分为以下4种:]
①满向上生长型:堆栈按高地址方向生长,当前堆栈指针指向一个有效值;
②空向上生长型:堆栈按高地址方向生长,当前堆栈指针指向一个空值;
③满向下生长型:堆栈按低地址方向生长,当前堆栈指针指向一个有效值;
④空向下生长型:堆栈按低地址方向生长,当前指针指向一个空值。
图3-2说明了4条带不同变量和多字节传送前后和内存变化,以及基寄存器的变化情况。指令执行前的基寄存器是R9,指令执行后的基寄存器是R9’。
常见多字节传送指令如表3-1所示。
表3-1内FD|ED|FA|EA后缀只在堆栈时使用。F和E、分别代表指针指向为满或空。A和D分别表示堆栈是否向上或向下生长。例如:堆栈如果是向上生长,STM指令向上存放,LDM指令向下读取。IA、IB、DA、DB后缀在一般数据传送时使用。注意:LDMED与LDMIB是同一条指令(下同)。
图3-2多寄存器传送示意
表3-1常见多字节传送指令
5 协处理器寻址方式
ARM协处理器寻址方式包括以下4种方式:
(1)寄存器直接寻址([Rn]);
(2)前普址偏移寻址([Rn,#±《immed_8*4》]{!});
(3)后变址偏移寻址([Rn],#±《immed_8*4》);
(4)带参数无偏移寻址([Rn],{8-bit copro.OpTIon}。
3.2.2 ARM指令的条件执行
每条ARM指令都是有条件执行,包括特权调用和协处理器指令,可根据执行结果来选择是否更新条件码。若要更新条件码,则指令中须包含后缀"S"。条件占32位指令的高4位。
一些指令(如CMP、CMN、TST、和TEQ不需要后缀"S"。它们唯一的功能就是更新条件标志,且始终更新条件码。更新之前保持不变。没执行的条件指令对标志没影响,一些指令只更新部分标志,不影响其他标志。
可以根据另外指令设置的标志,有条件地执行某条指令,分如下两种情况:
l在更新标志的指令后立即执行;
l在插入的几条不更新标志的指令后执行。
条件码中的N、Z、C和V位的值将决定指令如何执行。条件如表3-2所示。
表3-2 ARM条件码
表3-2中符号"*"的说明:HS、LO、HI、LS这4个条件码指的是无符号数,GE、LT、GT、LE这4个条件码指的是符号数。
3.2.3 Load/Store类指令
1. 单字和无符号字节Load/Store类指令
功能:提供ARM寄存器和内存之间单字节(8位)数据的传送。
格式:
(1)零偏移(zero offet)
LDR|STR{《条件码}}{B}{T} Rd,[Rn] ;((Rn))→Rd
零偏移指的是将Rn的内容作为传送数据的地址。
(2)前变址(pre-indexed offet)
LDR|STR{《条件码》}{B} Rd,[Rn,《offset》]{!}
;((Rn)+offset)→Rd
;有"!",(Rn)+offset→Rn
;无"!",Rn不变
前变址指的是在数据传送之前,将偏移量加到Rn中,其结果作为传送数据的存储地址。若使用后缀"!",则结果写回到Rn中。Rn不允许是Rn15。
(3) 程序相对偏移(program-relaTIve)
LDR|STR{《条件码》}Rd,Ladel ;(Label) →Rd
程序相对偏移指的是由PC计算偏移量,并将PC生成指令。不能使用后缀"!"。"LDR Rd,Label"等价为"LDR Rd,[Rn],offset"等价为"((Rn))→Rd,(Rn)+offset→Rn]"
(4) 后变址(post-indexed offset)
LDR|STR{《条件码》{B}{T} Rd,[Rn],《offset》
后变址指的是将Rn的值用作传送数据的存储器地址,数据传送后,偏移量加到Rn中,结果写回到Rn。Rn不允许是R15。"LDR Rd,[Rn],offset"等价为"((Rn))→,(Rn)+offset→Rn"。
其中:
B 可选后缀。若有B,则传送Rd的最低有效字节。若操作码是LDR,则将Rd的其他字节清零。
T 可选后缀。若有T,那么即使处理器在特权模式下,存储系统也将访问看成是处理器在用户模式下。T在用户模式下无效,不能与前变址偏移一起使用T。
Rd ARM寄存器。
Rn 存储器的基址寄存器,若指令是带写回(write back)的前变址(后缀为"!")或后变址,或使用T后缀,则不允许Rn与Rd相同。
Offset Rn上的偏移量。
Label 程序相对偏移表达式,必须在当前指令的前指令的±4KB内。
! 可选后缀。若有"!"则将包含偏移量的地址写回到Rn。若Rn是R15,则不能使用后缀"!"。
注释:
(1) offset 说明
前变址和后变址格式中的offset可以是2种形式之一:
(2) exression
其含义是符号表达式,通常是数字整
- 什么是LED驱动时序?LCD背光驱动程序设计(04-26)
- LCD驱动的移植及其GUI仿真如何进行,LCD数模转换现实原理及其源代码(04-25)
- wince代码写入LCD驱动参考,数码产品怎样分别是不是LCD坏点(04-26)
- ARM微处理器助记符指令及其功能描述(04-30)
- 布线工程师如何充分“掌控”时钟信号?(02-21)
- FPGA组成、工作原理和开发流程(10-13)