ARM汇编指令总结--英文全称及功能描述

一、什么是指令集

在计算机的世界里,CPU只能识别二进制的机器码,对于一个32位ARMv7架构来说,每一个指令由32个0或1的组合组成,CPU的设计者会指定一组固定的组合格式,告诉CPU完成什么动作,这组固定格式的0或1的组合就是指令集。
对于程序员来说,阅读二进制的机器码是一个相当大的挑战,为了便于编写程序,最早的汇编语言就诞生了,比如
ADD R0,R1,R2
这句话的的作用是寄存器R1、R2里的值求和后,存储到R0里面。
汇编语言通过编译器的编译,转换成CPU能够识别的二进制机器码。

二、ARM指令集版本历史

计算机完成一定的操作通过指令来实现,不同的指令方式被称为计算机架构,目前计算机主要有三大架构阵营,一是CISC(Complex Instruction Set Computers)复杂指令集架构,另一种是RISC(Reduced Instruction Set Computers)精简指令集架构,此外还有一个国内比较火的MIPS指令集。采用CISC架构的代表是Intel和AMD的X86指令集,采用RISC架构的代表是ARM指令集和PowerPC指令集。ARM架构从诞生到今天从V1版本已经升级到了V8版本,各版本代表的分支型号如下表所示。

架构处理器家族历史
ARMv1ARM1最早由Acorn 计算机公司设计,1985年开发出样本。
ARMv2ARM2、ARM31986年开发出ARM2,32位数据,26位地址空间。
ARMv3ARM6、ARM71990年设计团队组成新公司Advanced RISC Machines Ltd. (安某国际
ARMv4StrongARM、ARM7TDMI、ARM9TDMI 
ARMv5ARM7EJ、ARM9E、ARM10E、XScale 
ARMv6ARM11、ARM Cortex-M 
ARMv7ARM Cortex-A、ARM Cortex-M、ARM Cortex-R 
ARMv8Cortex-A35、Cortex-A50系列[14]、Cortex-A72、Cortex-A73 

从图中可以看出,Cortex-A9 架构的CPU采用的是ARMv7的指令集,目前高性能的64位视频处理,比如Cortex-A72,采用的是ARMv8指令集。
高版本的指令集会向下兼容低版本,在低版本的基础上增加了更多特殊用途的指令集,比如浮点运算,CPU加速、数据安全等特殊用途的指令集。

在这里插入图片描述

三、ARM指令格式

ARM指令格式形式如下:

指令 {条件} {S} {目的Register},{OP1},{OP2}

括号中的操作都是可选项,对应的32机器码,哪里代表指令,哪里代表条件,哪里代表操作数呢? 请看下表。

313029282726252423222120191817161514131211109876543210
Cond   OpcodeSRnRdShift_operand

不同域的具体意义如下表所示:

[31:28]Cond条件域,用来定义指令执行的条件
[27:25]指令类别,跳转指令、数据处理指令、移位指令等等
[24:21]Opcode指令域,代表具体的指令,比如ADD,MOV等。
[20]S指令的后缀,可加可不加,指令后缀带S表示该指令的结果会影响CPSR寄存器。
[19:16]Rn第一个操作数(OP1)的寄存器编码
[15:12]Rd目标寄存器编码
[11:0]Shift_oprand第二个操作数(OP2)

下面给出一个从文档中抓出的表格,更详细的总结了指令格式。
在这里插入图片描述

四、特殊寄存器–CPSR

每种架构的CPU都有一组特殊用途的寄存器,用来存放从存储器读来数据或者指令编码,在ARM中,有一个特殊的寄存器叫CPSR(current program status register),用来存放当前指令执行的状态。比如存放数学运算结果的正负、借位、溢出等情况,详细信息如下表所示。

CPSR fieldF (Flags field mask byte)S (Stats field mask byte)X (Extension field mask byte)C (control field mask byte)
CPSR313029282726252423222120191817161514131211109876543210
意义NZCVQDNZ (RAZ) 系统扩展用IFTM4M3M2M1M0
 
CPSR各bit详细意义N 当前指令运算结果为负时,N = 1; 结果为非负时,N = 0
Z 运算结果为0Z1;否则Z0
C 上溢出、进位C1;下溢出、借位C0
V 加减法V1表示符号位溢出
I I=1时,禁止IRQ中断
F F=1时,禁止FIQ中断
T T=0ARM指令;T1Thumb指令
M[4:0]0b10000User
0b10001FIQ
0b10010IRQ
0b10011Supervisor
0b10111Abort
0b11011Undefined
0b11111System
五、ARM指令举例
.data          /* the .data section is dynamically created and its addresses cannot be easily predicted */
var1: .word 3  /* variable 1 in memory */
var2: .word 4  /* variable 2 in memory */

.text          /* start of the text (code) section */ 
.global _start

_start:
    ldr r0, adr_var1  @ 加载adr_var1的内存地址到寄存器R0中。load the memory address of var1 via label adr_var1 into R0 
    ldr r1, adr_var2  @  加载adr_var2的内存地址到寄存器R1中。load the memory address of var2 via label adr_var2 into R1 
    ldr r2, [r0]      @  加载地址为adr_var1的内存中的数据到R2中。load the value (0x03) at memory address found in R0 to register R2  
    str r2, [r1]      @ R2中的数据保存到加载地址为adr_var2的内存中。store the value found in R2 (0x03) to the memory address found in R1 
    bkpt             

adr_var1: .word var1  /* address to var1 stored here */
adr_var2: .word var2  /* address to var2 stored here */

详细过程如下面的动画所示
在这里插入图片描述

六、ARM指令详表
1. 条件域(Cond)描述
31302928Cond域描述
0000EQZ=1Equal
0001NEZ=0Not equal, or unordered
0010CS/HSC=1Carry set / Unsigned higher or sameGreat than or equal, or unordered
0011CC/LOC=0Carry clear / Unsigned lowerLess than
0100MIN=1NegativeLess than
0101PLN=0Positive or zeroGreater than or equal , or unordered
0110VSV=1OverflowUnordered
0111VCV=0No overflowNot unordered
1000HIC=1Z0Unsigned higherGreater than, or unordered
1001LSC=0Z1Unsigned lower or sameLess than or equal
1010GEN=1V1 N0V0Signed greater than or equalGreater than or equal
1011LTN=1V0 N0V1Signed less thanLess than , or unordered
1100GTZ=0NVSigned greater thanGreat than
1101LEZ=1N!=VSigned less than or equalLess than or equal , or unordered
1110AL Always (unconditional)
2. 数据处理类指令编码

其它类指令请参阅 ARM Articheture Reference Manual

24232221Opcode域描述
0000ANDLogical AND
0001EORLogical Exclusive OR
0010SUBSubtract
0011RSBReverse Subtract
0100ADDAdd
0101ADCAdd with Carry
0110SBCSubtract with Carry
0111RSCReverse Subtract with Carry
1000TSTTest
1001TEQTest Equivalence
1010CMPCompare
1011CMNCompare Negated
1100ORRLogical OR
1101MOVMove
1110BICBit Clear
1111MVNMove Not
3. 指令汇总表
指令格式:  指令{条件}{S} {目的Register}{OP1}{OP2}"{ }"中的内容可选。即,可以不带条件只有目的寄存器,或
只有目的寄存器和操作数1,也可以同时包含所有选项。“S” 决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值
 助记符英文全称示例、功能
跳转指令BBranchB  Label ;程序无条件跳转到标号Label处执行
BLBranch with LinkBL Label ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14
BLXBranch with Link and exchangeBLX  Label ;从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中
BXBranch and exchangeBX  Label ;跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令
数据处理MOVMoveMOV R1,R0,LSL#3 ;将寄存器R0的值左移3位后传送到R1
MVNMove NOTMVN R0,#0 ;将立即数0取反传送到寄存器R0中,完成后R0=-1
CMPCompareCMP R1,R0  ;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位
CMNCompare negativeCMN R1,R0  ;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位
TSTTestTST R1,#0xffe ;将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位
TEQTest equivalenceTEQ  R1,R2 ;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位
ADDAddADD R0,R2,R3,LSL#1 R0 = R2 + (R3 << 1)
ADCAdd with carryADCS  R2,R6,R10R2 = R6R10!C,且更新CPSR的进位标志位
SUBSubtractSUB  R0,R1,#256  R0 = R1 – 256
SBCSubtract with carrySUBS R0,R1,R2  R0 = R1 - R2 - !C,并根据结果设置CPSR的进位标志位
RSBReverse subtractRSB R0,R1,R2 R0 = R2 – R1
RSCReverse subtract with carryRSC R0,R1,R2 R0 = R2  R1 - !C
ANDAndAND R0,R0,#3  该指令保持R001位,其余位清零。
ORRORORR R0,R0,#3 该指令设置R001位,其余位保持不变。
EORExclusive OREOR R0,R0,#3  该指令反转R001位,其余位保持不变。
BICBit clearBIC R0,R0,#0b1011 该指令清除 R0 中的位 01、和 3,其余的位保持不变。
CLZCount left zero计算操作数最高端0的个数
乘加指令MULMultiplyMUL R0,R1,R2  ;R0 = R1 × R2
MLAMultiply and accumulateMLAS R0,R1,R2,R3R0 = R1 × R2 + R3,同时设置CPSR中的相关条件标志位
SMULLSigned multiply longSMULL R0,R1,R2,R3  ;R0 = R2 × R3)的低32R1 = R2 × R3)的高32
SMLALSigned mul l and accumulate lSMLAL R0,R1,R2,R3R0 =R2 × R3)的低32位+R0; R1 =R2 × R3)的高32位+ R1
UMULLUnsigned multiply longUMULL R0,R1,R2,R3 R0 = R2 × R3)的低32位;R1 =R2 × R3)的高32
UMLALUnsigned mul&accumulate lonUMLAL R0,R1,R2,R3 R0 =R2 × R3)的低位+R0R1 =R2 × R3)的高32位+R1
PSR访问MRSMove PSR to registerMRS R0,CPSR ;传送CPSR的内容到R0
MSRMove register to PSRMSR CPSR_c ,R0 ;传送R0的内容到CPSR,但仅仅修改CPSR中的控制位域
加载/存储指令LDRLoad wordLDR R0,[R1,R2]! ;将存储器地址为R1+R2的字数据读入R0,并将新地址R1R2写入R1
LDRBLoad byteLDRB R0,[R1,#8] ;将存储器地址为R18的字节数据读入R0,并将R0的高24位清零
LDRHLoad half wordLDRH  R0,[R1] ;将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零
LDMLoad multipleLDMFD  R13!,{R0,R4-R12,PC} ;将堆栈内容恢复到寄存器(R0R4R12LR
STRStoreSTR R0,[R1],#8 ;将R0中的字数据写入R1为地址的存储器中,并将新地址R18写入R1
STRBStore byteSTRB R0,[R1,#8]  ;将寄存器R0中的字节数据写入以R18为地址的存储器中
STRHStore half wordSTRH R0,[R1,#8] ;将寄存器R0中的半字数据写入以R18为地址的存储器中
STMStore multipleSTMFD R13!,{R0,R4-R12,LR} ;将寄存器列表中的寄存器(R0R4R12LR)存入堆栈
数据交换SWPSwap wordSWP R0,R1,[R2]R2所指的字数据传送到R0,同时R1的数据传送到R2所指的单元
SWPBSwap byteSWPB R0,R1,[R2] R2所指的字节数据传送到R0R024位清零,同时R18位送R2所指单元。
移位指令LSLLogic shift leftMOV  R0, R1, LSL#2ASL#2 ;将R1中的内容左移两位后传送到R0,低位用0填充
ASLArithmetic shift left
LSRLogic shift rightMOV R0, R1, LSR#2 ;将R1中的内容右移两位后传送到R0中,左端用零来填充
ASRArithmetic shift rightMOV R0, R1, ASR#2 ;将R1中的内容右移两位后传送到R0中,左端31位的值来填充
RORRotate rightMOV R0, R1, ROR#2 ;将R1中的内容循环右移两位后传送到R0
RRXRotate right extended左端进位标志位C来填充
协处理器CDPData operations 
LDCLoad 
STCStore 
MCRMove to coproc fr ARM reg 
MRCM to ARM reg fr coprocessor 
 
并行指令前缀S Signed arithmetic modulo 28 or 216 ,sets CPSR GE bit
Q Signed saturating arithmetic
SH Signed arithmetic, halving results
U Unsigned arithmetic modulo 28 or 216 ,sets CPSR GE bit
UQ Unsigned saturating arithmetic
UH Unsigned arithmetic ,halving results
批量传输地址模式Block load / storeStack pop / push
IAIncrement afterFDFull descending
IBIncrement beforeEDEmpty descending
DADecrement afterFAFull ascending
DBDecrement beforeEAEmpty ascending
 
ARM指令寻址方式立即寻址ADD R0,R0,#0x3fR0←R0+0x3f
寄存器寻址ADD R0,R1,R2R0←R1+R2
间接寻址ADD R0,R1,[R2]R0←R1+[R2]
变址寻址LDR R0,[R1,#4]R0←[R1+4]
LDR R0,[R1,#4]!R0←[R1+4]、R1←R1+4
LDR R0,[R1] ,#4R0←[R1]、R1←R1+4
LDR R0,[R1,R2]R0←[R1+R2]
多寄存器寻址LDMIA R0,{R1,R2,R3,R4}R1←[R0];R2←[R0+4];R3←[R0+8];R4←[R0+12]
 
伪指令及伪操作
符号定义 GBLA / LCLA定义一个全局 / 局部的数字变量,并初始化为0
GBLL / LCLL定义一个全局 / 局部的逻辑变量,并初始化为F(假)
GBLS / LCLS定义一个全局 / 局部的字符串变量,并初始化为空
SETA / SETL / SETS给一个数学 / 逻辑 / 字符串变量赋值
RLIST对一个通用寄存器列表定义名称,访问次序为根据寄存器的编号由低到高,与排列次序无关
数据定义 DCB(=)/ DCW(DCWU分配一片连续的字节 / 半字存储单元并用指定的数据初始化后缀U表示不要求对齐
DCFS(DCFSU/DCFDDCFDU分配一片连续的/ 双精度的浮点数)字存储单元并用指定的数据初始化
DCQ(DCQU)DCD(DCDU)用于分配一片以双字 / 字为单位的连续的存储单元并用指定的数据初始化
DCDO分配字内存但愿,初始化为标号基于静态基址寄存器R9的偏移量
DCIDCD类似,不同处在于DCI内存中的数据被标识为指令
SPACE(%)DataSpace SPACE 100 ;分配连续100字的存储单初始化0
MAP(^)MAP 0x100,R0 ;定义结构存表首地址的值为0x100+R0
FIELD(#)A FIELD 16 A的16字
控制伪指令IF、ELSE、ENDIFIF 逻辑表达式IF、ELSEENDIF伪指令能根据条件的成立与否决定是否执行某个指令序列。
指令序列1IF后面的逻辑表达式为真,则执行指令序列1,否则执行指令序列2。其中,
ELSEELSE及指令序列2可以没有,此时,当IF后面的逻辑表达式为真,则执行
指令序列2指令序列1,否则继续执行后面的指令。
ENDIF 
WHILE、WENDWHILE 逻辑表达式WHILE、WEND伪指令能根据条件的成立与否决定是否循环执行某个指令序列。当WHILE后面的逻辑表达式为真,则执行指令序列,该指令序列执行完毕后,再判断逻辑表达式的值,若为真则继续执行,一直到逻辑表达式的值为假。
指令序列
WEND
MACRO、MENDMACRO$标号在宏指令被展开时,标号会被替换为用户定义的符号,
MEXIT$标号 宏名 $参数1$参数2,……指令序列宏指令可以使用一个或多个参数,当宏指令被展开时,这些参数被相应的值替换。
 MENDMEXIT用于从宏定义中跳转出去
 AREAAREA 段名 属性1,属性2,……用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名需用“|”括起来,如|1_test|
 ALIGNAREA Init,CODE,ALIEN=3指定后面的指令为8字节对齐
 CODECODE16、CODE32指定指令序列为16位的Thumb指令或32位的ARM指令
 ENTRY 在一个完整的汇编程序中至少要有一个ENTRY(也可以有多个,当有多个ENTRY时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个ENTRY(可以没有)。
 EQU*EQU  {,型}为程序中的常量、标号等定义一个等效的字符名称
 EXPORTEXPORT  标号用于在声明一个全局的标号,该标号可在其他的文件中引用。EXPORT可用GLOBAL代替。
 IMPORTIMPORT  标号用于通知编译器要使用的标号在其他的源文件中定义,无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中
 EXTERNEXTERN  标号用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,如果当前源文件实际并未引用该标号,该标号就不会被加入到当前源文件的符号表中
 GETGET  文件名将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理
 INCBININCBIN  文件名INCBIN伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前文件中,编译器从其后开始继续处理
 RN  RN  表RN伪指令用于给一个寄存器定义一个别名
 ROUT{名} ROUTROUT伪指令用于给一个局部变量定义作用范围。在程序中未使用该伪指令时,局部变量的作用范围为所在的AREA,而使用ROUT后,局部变量的作为范围为当前ROUT和下一个ROUT之间。
  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值