ARM汇编指令集汇总

ARM汇编指令集汇总ARM 汇编指令集汇总作者 毛茏玮 Saint 掘金 https juejin im user 5aa1f89b6fb9 微博 https weibo com profile topnav 1 amp wvr 6 amp is all 1GitHub github com saint 000CSDN https me csdn

在这里插入图片描述

ARM汇编指令集汇总

1.数据传送指令

【MOV指令】:它的传送指令只能是把一个寄存器的值(要能用立即数表示)赋给另一个寄存器,或者将一个常量赋给寄存器,将后边的量赋给前边的量。

指令示例:

MOV R1,R0 ;将寄存器R0的值传送到寄存器R1 MOV PC,R14 ;将寄存器R14的值传送到PC,常用于子程序返回 MOV R1,R0,LSL#3 ;将寄存器R0的值左移3位后传送到R1(即乘8) MOVS PC, R14 ;将寄存器R14的值传送到PC中,返回到调用代码并恢复标志位 

除了MOV指令外,还有数据取反传送指令MVN。 【MVN指令】

指令示例:

MVN R0,#0 ;将立即数0取反传送到寄存器R0中,完成后R0=-1(有符号位取反) 

2.算术运算指令

(1)【加法指令】:ADD

指令示例:

ADD R0,R1,R2 ; R0 = R1 + R2 ADD R0,R1,#256 ; R0 = R1 + 256 ADD R0,R2,R3,LSL#1 ; R0 = R2 + (R3 << 1) 
ADDS R0,R4,R8 ; 加低端的字,R0=R4+R8 ADCS R1,R5,R9 ; 加第二个字,带进位,R1=R5+R9 ADCS R2,R6,R10 ; 加第三个字,带进位,R2=R6+R10 ADC R3,R7,R11 ; 加第四个字,带进位,R3=R7+R11 
SUB R0,R1,R2 ; R0 = R1 - R2 SUB R0,R1,#256 ; R0 = R1 - 256 SUB R0,R2,R3,LSL#1 ; R0 = R2 - (R3 << 1) 
SUBS R0,R1,R2 ;R0 = R1 - R2 - !C,并根据结果设置CPSR的进位标志位 
CMP R1,R0 ;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位 CMP R1,#100 ;将寄存器R1的值与立即数100相减,并根据结果设置CPSR的标志位 
CMN R1,R0 ;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位 CMN R1,#100 ;将寄存器R1的值与立即数100相加,并根据结果设置CPSR的标志位 
AND R0,R0,#3 ; 该指令保持R0的0、1位,其余位清零。 
ORR R0,R0,#3 ; 该指令设置R0的0、1位,其余位保持不变。 
EOR R0,R0,#3 ; 该指令反转R0的0、1位,其余位保持不变。 
BIC R0,R0,#%1011 ; 该指令清除 R0 中的位 0、1、和 3,其余的位保持不变。 
TST R1,#%1 ;用于测试在寄存器R1中是否设置了最低位(%表示二进制数) TST R1,#0xffe ;将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位 
TEQ R1,R2 ;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位 

二.汇编转移指令
【跳转指令】
跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转:
— 使用专门的跳转指令。
— 直接向程序计数器PC写入跳转地址值。
通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。
ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:












 — B 跳转指令 — BL 带返回的跳转指令 — BLX 带返回和状态切换的跳转指令 — BX 带状态切换的跳转指令 
B Label ;程序无条件跳转到标号Label处执行 CMP R1,#0 ;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label处执行 BEQ Label 
BL Label ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中 

三.汇编程序状态寄存器访问指令
1、【MRS指令】
MRS指令的格式为:
MRS{条件} 通用寄存器,程序状态寄存器(CPSR或SPSR)
MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下几种情况:
- 当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
- 当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。
指令示例:














MRS R0,CPSR ;传送CPSR的内容到R0 MRS R0,SPSR ;传送SPSR的内容到R0 
位[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中的控制位域 

四.汇编加载/存储指令
ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下:
在这里插入图片描述




指令示例:

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 R0,[R1] ;将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零。 LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,并将R0的高24位清零。 
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 R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。 STR R0,[R1,#8] ;将R0中的字数据写入以R1+8为地址的存储器中。 
STRB R0,[R1] ;将寄存器R0中的字节数据写入以R1为地址的存储器中。 STRB R0,[R1,#8] ;将寄存器R0中的字节数据写入以R1+8为地址的存储器中。 
STRH R0,[R1] ;将寄存器R0中的半字数据写入以R1为地址的存储器中。 STRH R0,[R1,#8] ;将寄存器R0中的半字数据写入以R1+8为地址的存储器中。 
 — LDM 批量数据加载指令 — STM 批量数据存储指令 
LDM(或STM){条件}{类型} 基址寄存器{!},寄存器列表{∧} 

LDM(或STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。其中,{类型}为以下几种情况:

IA 每次传送后地址加1; IB 每次传送前地址加1; DA 每次传送后地址减1; DB 每次传送前地址减1; FD 满递减堆栈; ED 空递减堆栈; FA 满递增堆栈; EA 空递增堆栈; 
STMFD R13!,{R0,R4-R12,LR} ;将寄存器列表中的寄存器(R0,R4到R12,LR)存入堆栈。 LDMFD R13!,{R0,R4-R12,PC} ;将堆栈内容恢复到寄存器(R0,R4到R12,LR)。 

五.汇编异常产生指令
1、【SWI指令】
SWI指令的格式为:




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

六.汇编伪代码

1.【AREA】一个汇编程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段,因此在汇编程序的开头,我们一般的语句会用到AREA。

语法格式:AREA 段名 属性 1 ,属性 2 ,....   

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

使用示例:

AREA Init , CODE , READONLY ;该伪指令定义了一个代码段,段名为 Init ,属性为只读。  

2、【ALIGN】语法格式:

ALIGN { 表达式 { ,偏移量 }}     

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

AREA Init , CODE , READONLY             ENTRY ;指定应用程序的入口点 .....    
AREA Init , CODE , READONLY             ......      END ;指定应用程序的结尾 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176555.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午9:38
下一篇 2026年3月26日 下午9:39


相关推荐

  • pyCharm 专业版最新激活方法

    pyCharm 专业版最新激活方法pyCharm 最新激活方法亲测可行 转发保存一下传送门

    2026年3月26日
    2
  • 微生物组-宏基因组分析第9期(报名直播课免费参加线下2020最后一期)

    微生物组-宏基因组分析第9期(报名直播课免费参加线下2020最后一期)福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析、宏基因组、Python课程和转录组的线上直播课。报名参加线上直播课的老师可在1年内选择参加同课…

    2022年5月27日
    53
  • 协同过滤推荐算法研究

    针对电子商务发展的需求,本文通过对协同过滤推荐算法的文献综述,提出传统过滤算法无法适用于用户多兴趣下的推荐问题进行了剖析,提出了一种基于用户多兴趣的协同过滤推荐改进算法,分析了基于用户多兴趣的协同过滤推荐算法的电子商务系统。
      一、引言
      电子商务迅猛发展的时代已经到来,网上购物的交易方式正在改变着传统的商业模式。2007年,电子商务的交易额达到了8900亿人民币。面对如此众多的商品,无疑会大大增加用户发现满意商品的困难。于是个性化推荐系统逐渐成为电子商务领域中的一项重要

    2022年4月8日
    47
  • obs录制黑屏怎么解决_obs窗口捕获黑屏

    obs录制黑屏怎么解决_obs窗口捕获黑屏00.目录文章目录00.目录01.问题描述02.问题分析03.问题解决04.成功测试01.问题描述打开OBS后,新建场景、新建显示器捕获后,黑屏没有显示,即使点击开始录制,然后结束录制后,录制的视频仍然是黑屏。02.问题分析安装包是从官网下载的,安装过程没有报错,启动过程也没有报错,但是却捕捉不到显示器中的图像。首先考虑的是软件兼容性的问题,但是在我将兼容性设置成”W…

    2022年4月19日
    112
  • java中什么是重载什么是重写_java的重载

    java中什么是重载什么是重写_java的重载我们先从定义上区分重载和重写:1、重载(overload)是发生在同个类中的具有相同的方法名,不同的参数类型(不同的参数类型包括:参数的个数和参数的类型和顺序不同),返回值相同或者不同的一种多态的体现。从返回值类型相同或者不相同可以看出,我们不能根据方法的返回值来判断是否为重载。例如:下类Animal中的getFun方法构成了方法的重载publicclassAnimal{publicvoid…

    2025年10月15日
    5
  • 如何查看linux操作系统版本号_如何查看centos版本

    如何查看linux操作系统版本号_如何查看centos版本Linux系统自问世后,产生了各种分支,目前主流的操作系统版本有reahat,Centos,Ubuntu,debian,Suselinux等,不同操作系统命令上也稍有区别,那么在linux主机上,我们怎么查看操作系统的版本号呢?工具/原料 xshell6 Centos7 方法/步骤 方式一:通过命令cat/etc/redhat-release,主要针对redhat系列,redhat,centos都可以通过此命令查看。 方式二:如下方法即可查看操作系统版本,

    2025年11月22日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号