ARM汇编指令入门总结

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

数据处理指令

数据传送指令

MOV指令

MOV{条件}{S} 目的寄存器,源操作数
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指令

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

算数运算指令

ADD指令

ADD{条件}{S} 目的寄存器,操作数1,操作数2
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指令

ADC{条件}{S} 目的寄存器,操作数1,操作数2
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指令

SUB{条件}{S} 目的寄存器,操作数1,操作数2
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指令

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

比较指令

CMP指令

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

CMN指令

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

逻辑运算指令

AND指令

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

ORR指令

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

EOR指令

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

BIC指令

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

测试指令

TST指令

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

TEQ指令

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

乘法指令

MUL指令

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>:第二个乘数所在寄存器
 MUL R1,R2,R3         ;R1=R2*R3

MLA指令

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

UMULL指令

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

UMLAL指令

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

SMULL指令

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

SMLAL

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

转移指令

B指令

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

BL指令

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

BLX指令

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

BX指令

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

程序状态寄存器访问指令

MRS指令

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

MSR指令

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

加载/存储指令

LDR指令

LDR{条件} 目的寄存器,<存储器地址>
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指令

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

LDRH指令

LDR{条件}H 目的寄存器,<存储器地址>
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指令

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

STRB指令

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

STRH指令

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

LDM/STM指令

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

异常产生指令

SWI指令

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

BKPT指令

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

伪指令

AREA指令

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

ALIGN指令

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

CODE16/CODE32指令

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

ENTRY指令

ENTRY 		;用于指定汇编程序的入口点
AREA Init , CODE , READONLY            
ENTRY ;指定应用程序的入口点
.....   

END 指令

END 		;用于通知编译器已经到了源程序的结尾
AREA Init , CODE , READONLY            
......     
END ;指定应用程序的结尾
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值