arm的汇编指令精选合辑
作码》是下列的任何一种:
ASR算术右移。将寄存器中的内容看作补码形式的有符号整数。将符号位移拷贝到空位。
LSL逻辑左移,移入为0。
LSR逻辑右移,移入为0。
ROR循环右移。将寄存器右移出的位循环移回到左端。ROR仅能与寄存器控制的移位一起使用。
Rd立即数移位的目的寄存器。必须在R0~R7范围内。
Rn立即数移位的源寄存器。Rn必须在R0~R7范围内。
Immed_5 立即数移位量。它是一个取值为整数的表达式。整数的范围如下:
《操作码》若是LSL,ROR,则为0~31;
其余则为1~32。
格式2:
《操作码》 Rd|Rn,Rs|Rm
其中:
《操作码》同格式1。
Rd 寄存器控制移位的源寄存器。Rd必须在R0~R7范围内。
Rs 在控制移位中包含移位量的寄存器。Rs必须在R0~R7范围内。
注释:
(1)立即数移位(格式1)。
指令从Rn取值,并对其进行移位,结果放回Rd中。
(2)寄存器控制移位(格式2)
这些指令从Rd中取值,并对其进行移位,结果放回Rd.只有Rs的最低的效数字节可用作移位量。
对于除ROR以外的所有指令,则有
若移位量为32,则Rd清零。最后移出的位保留在标志C中。
若移位量大于32,则Rd和标志C均被清零。
(3)条件码标志
这些指令根据结果更新标志N与Z,且不影响标志V。对于标志C,若移位量是零,则它不受影响,其他情况下,它包含源寄存器的最后移出位。
例:ASR R3,R5
LSR R0,R2,#6
LSR R%,R5,av; av的值必须在汇编时取成在1~32范围内的整数
LSL R0,R4,#0 ;除了不影响标志C和V外,同"MOV R0,R4"
8 其他运算类指令
格式1:
《操作码》 Rd|Rn,Rm|Rs
《操作码》 包括:MOV,MVN,CMN,TST,ADC,SBC,NEG,MUL,AND,EOR,ORR,BIC指令。
《操作码》Rd|Rn,#expr
《操作码》包括:MOV,CMP指令。
Rd Rn 目的寄存器,它也是包含第1条指令操作数。
Rm Rs 第二操作数寄存器。
Expr 表达式,其值范围为在1~255内的整数。
表3~5 Thumb数据处理指令
助记符含义动作
ADC Rd,RmADD Rd,Rn,RmADD Rd,Rn,#0to7ADD Rd,#0to255AND Rd,RmASR Rd,Rm#1to32ASR Rd,RaBIC Rd,RaCMN Rn,RmCMP Rn,#0to255CMP Rn,RmEOR Rd,RmLSL Rd,Rm,#0to31LSL Rd,Rm,#1to32LSR Rd,Rm,#1to32LSR Rd,RsMOV Rd,#0to255MOV Rd,RnMUL Rd,RmMVN Rd,RmNEG Rd,RmORR Rd,RmRORRd,RsSBC Rd,RmSUBRd,Rn,RmSUB Rd,Rn,RmSUB Rd,#0to255TST Rn,Rm带进位加法加法加法加法逻辑与算术右移算术右移位清除比较非值比较比较逻辑异或逻辑左移逻辑左移逻辑右移逻辑右移传送传送乘法传送非取负逻辑或循环右移带进位减法减法减法减法测试Rd---Rd+Rm+进位标志Rd---Rn+RmRd---Rn+3位立即数Rd---Rd+8位立即数Rd---Rd AND RmRd---Rm ASR5位立即数Rd---Rd ASR RsRd---Rd AND NOT RmRn+Rm更新标志Rn—8后立即更新标志Rn—RmRd---Rd EOR RmRd---Rm LSL 5位立即数Rd---Rm LSL RsRd---Rd LSR 5位立即数Rd---Rd LSR RsRd---8位立即数Rd---RnRd---Rm*RdRd---NOT RmRd---0--RmRd---Rd OR RmRd---Rd ROR RsRd--Rd-Rm-NOT(进位标志)Rd---Rn--RmRd---Rn—3位立即数Rd---Rn—8立即数Rn AND Rm后更新标志
注释:
(1)除了"CMP RN,Rm"和"MOV Rd,Rm"指令中的和可以是中的Rn,Rm任何寄存器外,其余指令只能使用低寄存器(R0~R7)
(2)条件码标志:
ADC,SBC,CMP,CMN和NEG指令更新标志N,Z,C和V.
AND,EOR,ORR,BIC指令根据结果更新标志N和Z
MVN,TST,"MOV Rd,#expr"和指令更新标志N和Z,对标志C和V影响。
"MOV Rd,Rm"指令表现如下:
若Rd或Rm是高寄存器(R8~R15),则标志不受影响。
若Rd或Rm都是低寄存器(R0~R7),则更新标志N和Z,且清除清除标志C和V。
MUL更新标志N和Z。在ARM v4及前版本中,MUL会使标志C和V不可靠。在ARM v5及以后的版本中,MUL不影响标志C和V。
注意:可用移位为0来使用LSL,实现在低寄存器之间传送而不清除标志C,V。
例:
ADC R2,R4
CMP R7,R12 ; 指令"CMP Rn,Rm"允许高寄存器
MOV R3,#0
TST R2,R4
3.3.3 Thumb转移指令
Thumb 转移指令主要分以下几类:
1 B指令
格式1:
B 《条件码》 《Label》
格式2:
B 《Label》
其中:
Label 程序相对偏移表达式。通常是在同一代码块内标号。
若使用条件码,则必须在当前指令的—254~+254字节范围内;
若指令是无条件,则Label必须中正负2KB范围内。
Thumb B指令
- 什么是LED驱动时序?LCD背光驱动程序设计(04-26)
- LCD驱动的移植及其GUI仿真如何进行,LCD数模转换现实原理及其源代码(04-25)
- wince代码写入LCD驱动参考,数码产品怎样分别是不是LCD坏点(04-26)
- ARM微处理器助记符指令及其功能描述(04-30)
- 布线工程师如何充分“掌控”时钟信号?(02-21)
- FPGA组成、工作原理和开发流程(10-13)