我是靠谱客的博主 繁荣胡萝卜,这篇文章主要介绍ARM汇编指令入门总结数据处理指令转移指令程序状态寄存器访问指令加载/存储指令异常产生指令伪指令,现在分享给大家,希望可以做个参考。

学习笔记分享,用于ARM初学者查找命令,来源:精简于ARM汇编指令集汇总

数据处理指令

数据传送指令

MOV指令

复制代码
1
2
MOV{条件}{S} 目的寄存器,源操作数
复制代码
1
2
3
4
5
MOV R1,R0 ;将寄存器R0的值传送到寄存器R1 MOV PC,R14 ;将寄存器R14的值传送到PC,常用于子程序返回 MOV R1,R0,LSL#3 ;将寄存器R0的值左移3位后传送到R1(即乘8) MOVS PC, R14 ;将寄存器R14的值传送到PC中,返回到调用代码并恢复标志位

MVN指令

复制代码
1
2
MVN{条件}{S} 目的寄存器,源操作数
复制代码
1
2
MVN R0,#0 ;将立即数0取反传送到寄存器R0中,完成后R0=-1(有符号位取反)

算数运算指令

ADD指令

复制代码
1
2
ADD{条件}{S} 目的寄存器,操作数1,操作数2
复制代码
1
2
3
4
ADD R0,R1,R2 ;R0 = R1 + R2 ADD R0,R1,#256 ;R0 = R1 + 256 ADD R0,R2,R3,LSL#1 ;R0 = R2 + (R3 << 1)

ADC指令

复制代码
1
2
ADC{条件}{S} 目的寄存器,操作数1,操作数2
复制代码
1
2
3
4
5
ADDS R0,R4,R8 ;加低端的字,R0=R4+R8 ADCS R1,R5,R9 ;加第二个字,带进位,R1=R5+R9+'C' ADCS R2,R6,R10 ;加第三个字,带进位,R2=R6+R10+'C' ADC R3,R7,R11 ;加第四个字,带进位,R3=R7+R11+'C'

SUB指令

复制代码
1
2
SUB{条件}{S} 目的寄存器,操作数1,操作数2
复制代码
1
2
3
4
SUB R0,R1,R2 ;R0 = R1 - R2 SUB R0,R1,#256 ;R0 = R1 - 256 SUB R0,R2,R3,LSL#1 ;R0 = R2 - (R3 << 1)

SBC指令

复制代码
1
2
SBC{条件}{S} 目的寄存器,操作数1,操作数2
复制代码
1
2
3
4
SBC RO,R1,R2 ;R0 = R1 - R2 - '!C' SUBS R0,R1,R2 ;R0 = R1 - R2 - '!C',并根据结果设置CPSR的进位标志位 ;注意不要忘记设置S后缀来更改进位标志

比较指令

CMP指令

复制代码
1
2
CMP{条件} 操作数1,操作数2
复制代码
1
2
3
CMP R1,R0 ;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位 CMP R1,#100 ;将寄存器R1的值与立即数100相减,并根据结果设置CPSR的标志位

CMN指令

复制代码
1
2
CMN{条件} 操作数1,操作数2
复制代码
1
2
3
CMN R1,R0 ;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位 CMN R1,#100 ;将寄存器R1的值与立即数100相加,并根据结果设置CPSR的标志位

逻辑运算指令

AND指令

复制代码
1
2
AND{条件}{S} 目的寄存器,操作数1,操作数2
复制代码
1
2
AND R0,R0,#3 ; 该指令保持R0的0、1位,其余位清零。

ORR指令

复制代码
1
2
ORR{条件}{S} 目的寄存器,操作数1,操作数2
复制代码
1
2
ORR R0,R0,#3 ; 该指令设置R0的0、1位,其余位保持不变。

EOR指令

复制代码
1
2
EOR{条件}{S} 目的寄存器,操作数1,操作数2
复制代码
1
2
EOR R0,R0,#3 ;该指令反转R0的0、1位,其余位保持不变。

BIC指令

复制代码
1
2
BIC{条件}{S} 目的寄存器,操作数1,操作数2
复制代码
1
2
BIC R0,R0,#%1011 ;该指令清除 R0 中的位 0、1、和 3,其余的位保持不变。

测试指令

TST指令

复制代码
1
2
TST{条件} 操作数1,操作数2
复制代码
1
2
3
TST R1,#%1 ;用于测试在寄存器R1中是否设置了最低位(%表示二进制数) TST R1,#0xffe ;将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位

TEQ指令

复制代码
1
2
TEQ{条件} 操作数1,操作数2
复制代码
1
2
TEQ R1,R2 ;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位

乘法指令

MUL指令

复制代码
1
2
3
4
5
6
7
8
MUL{<condition>}{S} <Rd>,<Rm>,<Rs> ;将Rm和Rs中的值相乘,结果的最低32位保存到Rd中 ;参数说明 ;S:S位(bit[20])决定指令的操作是否影响CPSR中的条件标志位N位和Z位的值。 ;当S=1时,跟新CPSR中的条件标志位的值;当S=0,指令不更新CPSR中的条件标志位。   ;<Rd>:寄存器位目标寄存器   ;<Rm>:第一个乘数所在寄存器   ;<Rs>:第二个乘数所在寄存器
复制代码
1
2
MUL R1,R2,R3 ;R1=R2*R3

MLA指令

复制代码
1
2
MLA{<condition>}{S} <Rd>,<Rm>,<Rs>,<Rn> ;将Rm和Rs中的值相乘,再将乘积加上第三个操作数Rn,结果的最低32保存到Rd中
复制代码
1
2
3
MOV R0,#0x0A MLA R1,R2,R3,R0 ;R1=R2*R3+10

UMULL指令

复制代码
1
2
3
4
5
UMULL{<condition>}{S} <RdLo>,<RdHi>,<Rm>,<Rs> ;UMULL为64位无符号乘法指令,指令将Rm和Rs中的值做无符号数相乘,结果的低32位保存到RsLo中,而高32位保存到RdHi中 ;参数说明 ;<RdLo>:寄存器位目标寄存器,存储结果的低32位值 ;<RdHi>:寄存器位目标寄存器,存储结果的高32位值
复制代码
1
2
UMULL R0,R1,R5,R8 ;((R1,R0)=R5*R8

UMLAL指令

复制代码
1
2
UMLAL{<condition>}{S} <RdLo>,<RdHi>,<Rm>,<Rs> ;UMLAL位64位无符号长乘-累加指令,指令将Rm和Rs中的值做无符号数相乘,64位乘积与RdHi,RdLo相加,结果的低32位保存到RsLo中,而高32位保存到RdHi中
复制代码
1
2
UMLAL R0,R1,R5,R8 ;(R1,R0)=R5*R8+(R1,R0)

SMULL指令

复制代码
1
2
SMULL{<condition>}{S} <RdLo>,<RdHi>,<Rm>,<Rs> ;SMULL64位有符号长乘指令,指令将Rm和Rs中的值做有符号数相乘,结果的低32位保存到RsLo中,而高32位保存到RdHi中
复制代码
1
2
SMULL R2,R3,R7,R6 ;(R3,R2)=R7*R6

SMLAL

复制代码
1
2
SMLAL{<condition>}{S} <RdLo>,<RdHi>,<Rm>,<Rs> ;SMLAL为64位有符号长乘法指令,指令将Rm和Rs中的值做有符号数相乘,64位乘积与RdHi,RdLo相加,结果的低32位保存到RsLo中,而高32位保存到RdHi中
复制代码
1
2
SMLAL R2,R3,R7,R6 ;(R3,R2)=R7*R6+(R3,R2)

转移指令

B指令

复制代码
1
2
B{条件} 目标地址
复制代码
1
2
3
4
B Label ;程序无条件跳转到标号Label处执行 CMP R1,#0 ;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label处执行 BEQ Label

BL指令

复制代码
1
2
BL{条件} 目标地址
复制代码
1
2
BL Label ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中

BLX指令

复制代码
1
2
BLX 目标地址
复制代码
1
2
;BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中

BX指令

复制代码
1
2
BX{条件} 目标地址
复制代码
1
2
;BX指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令

程序状态寄存器访问指令

MRS指令

复制代码
1
2
MRS{条件} 通用寄存器,程序状态寄存器(CPSR或SPSR)
复制代码
1
2
3
MRS R0,CPSR ;传送CPSR的内容到R0 MRS R0,SPSR ;传送SPSR的内容到R0

MSR指令

复制代码
1
2
MSR{条件} 程序状态寄存器(CPSR或SPSR)_<域>,操作数
复制代码
1
2
3
4
5
位[31:24]为条件标志位域,用f表示; 位[23:16]为状态位域,用s表示; 位[15:8]为扩展位域,用x表示; 位[7:0]为控制位域,用c表示;
复制代码
1
2
3
4
MSR CPSR,R0 ;传送R0的内容到CPSR MSR SPSR,R0 ;传送R0的内容到SPSR MSR CPSR_c,R0 ;传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域

加载/存储指令

LDR指令

复制代码
1
2
LDR{条件} 目的寄存器,<存储器地址>
复制代码
1
2
3
4
5
6
7
8
9
LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。 LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。 LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。 LDR R0,[R1,R2] ! ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。 LDR R0,[R1,#8] ! ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。 LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。 LDR R0,[R1,R2,LSL#2]! ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。 LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

LDRB指令

复制代码
1
2
LDR{条件}B 目的寄存器,<存储器地址>
复制代码
1
2
3
LDRB R0,[R1] ;将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零。 LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,并将R0的高24位清零。

LDRH指令

复制代码
1
2
LDR{条件}H 目的寄存器,<存储器地址>
复制代码
1
2
3
4
LDRH R0,[R1] ;将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零。 LDRH R0,[R1,#8] ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0的高16位清零。 LDRH R0,[R1,R2] ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将R0的高16位清零。

STR指令

复制代码
1
2
STR{条件} 源寄存器,<存储器地址>
复制代码
1
2
3
STR R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。 STR R0,[R1,#8] ;将R0中的字数据写入以R1+8为地址的存储器中。

STRB指令

复制代码
1
2
STR{条件}B 源寄存器,<存储器地址>
复制代码
1
2
3
STRB R0,[R1] ;将寄存器R0中的字节数据写入以R1为地址的存储器中。 STRB R0,[R1,#8] ;将寄存器R0中的字节数据写入以R1+8为地址的存储器中。

STRH指令

复制代码
1
2
STR{条件}H 源寄存器,<存储器地址>
复制代码
1
2
3
STRH R0,[R1] ;将寄存器R0中的半字数据写入以R1为地址的存储器中。 STRH R0,[R1,#8] ;将寄存器R0中的半字数据写入以R1+8为地址的存储器中。

LDM/STM指令

复制代码
1
2
LDM(或STM){条件}{类型} 基址寄存器{!},寄存器列表{∧}
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
;参数说明 ;类型 IA 每次传送后地址加1; IB 每次传送前地址加1; DA 每次传送后地址减1; DB 每次传送前地址减1; FD 满递减堆栈; ED 空递减堆栈; FA 满递增堆栈; EA 空递增堆栈; {!} 为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变 基址寄存器不允许为R15,寄存器列表可以为R0~R15的任意组合 {∧} 为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR
复制代码
1
2
3
4
STMFD R13!,{R0,R4-R12,LR} ;将寄存器列表中的寄存器(R0,R4到R12,LR)存入堆栈 LDMFD R13!,{R0,R4-R12,PC} ;将堆栈内容恢复到寄存器(R0,R4到R12,LR)

异常产生指令

SWI指令

复制代码
1
2
SWI{条件} 24位的立即数 ;SWI指令用于产生软件中断,以便用户程序能调用操作系统的系统例程
复制代码
1
2
SWI 0x02 ;该指令调用操作系统编号位02的系统例程。

BKPT指令

复制代码
1
2
BKPT 16位的立即数 ;BKPT指令产生软件断点中断,可用于程序的调试。

伪指令

AREA指令

复制代码
1
2
语法格式:AREA 段名 属性 1 ,属性 2 ,....  ;AREA 伪指令用于定义一个代码段或数据段
复制代码
1
2
3
4
5
6
7
8
;常用属性如下 — CODE 属性:用于定义代码段,默认为 READONLY 。             — DATA 属性:用于定义数据段,默认为 READWRITE 。       — READONLY 属性:指定本段为只读,代码段默认为 READONLY 。           — READWRITE 属性:指定本段为可读可写,数据段的默认属性为 READWRITE 。   — ALIGN 属性:使用方式为ALIGN 表达式。在默认时,ELF(可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为 0 ~31,相应的对齐方式为2表达式次方。 — COMMON 属性:该属性定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的 COMMON 段共享同一段存储单元。
复制代码
1
2
AREA Init , CODE , READONLY ;该伪指令定义了一个代码段,段名为 Init ,属性为只读。 

ALIGN指令

复制代码
1
2
ALIGN { 表达式 { ,偏移量 }}    ;ALIGN 伪指令可通过添加填充字节的方式,使当前位置满足一定的对其方式
复制代码
1
2
3
4
5
6
AREA Init,CODE ,READONLY,ALIEN=3;指定后面的指令为 8 字节对齐。       .... ;指令序列   ....  END      

CODE16/CODE32指令

复制代码
1
2
3
CODE16 伪指令通知编译器,其后的指令序列为 16 位的 Thumb 指令。       CODE32 伪指令通知编译器,其后的指令序列为 32 位的 ARM 指令
复制代码
1
2
3
4
5
6
7
8
9
10
11
AREA Init ,CODE ,READONLY             ....       CODE32 ;通知编译器其后的指令为 32 位的 ARM 指令             LDR R0,=NEXT+1 ;将跳转地址放入寄存器 R0       BX R0 ;程序跳转到新的位置执行,并将处理器切换到 Thumb 工作状态       ....      CODE16 ;通知编译器其后的指令为 16 位的 Thumb 指令             NEXT LDR R3,=0x3FF             ....      END ;程序结束         

ENTRY指令

复制代码
1
2
ENTRY  ;用于指定汇编程序的入口点
复制代码
1
2
3
4
AREA Init , CODE , READONLY             ENTRY ;指定应用程序的入口点 .....   

END 指令

复制代码
1
2
END  ;用于通知编译器已经到了源程序的结尾
复制代码
1
2
3
4
AREA Init , CODE , READONLY             ......      END ;指定应用程序的结尾

最后

以上就是繁荣胡萝卜最近收集整理的关于ARM汇编指令入门总结数据处理指令转移指令程序状态寄存器访问指令加载/存储指令异常产生指令伪指令的全部内容,更多相关ARM汇编指令入门总结数据处理指令转移指令程序状态寄存器访问指令加载/存储指令异常产生指令伪指令内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部