ARM指令集详解(超详细!带实例!)要点
第二讲ARM指令集课件

第二讲 ARM指令集
块拷贝与栈操作的对应关系
栈操作
块拷贝
先 增
后
先 减
后
地址变化方向
向上
向下
满
空
满
空
STMIB
LDMIB
STMFA
LDMED
STMIA
LDMIA
STMEA
LDMFD
LDMDB
STMDB
LDMEA
STMFD
LDMDA
STMDA
LDMFA
前变址不回写形式: [<Rn>,+/-<Rm>] 前变址回写形式: [<Rn>,+/-< Rm >]! 后变址回写形式: [<Rn>],+/-< Rm >
第二讲 ARM指令集
偏移量为寄存器值的指令编码类型对应关 系 31 28 27 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0
内容提要
3.1 3.2 3.3 3.4
ARM指令的编码格式 数据处理指令寻址方式 Load/Store指令寻址 批量Load/Store指令寻址方式
第二讲 ARM指令集
3.1 ARM指令的编码格式
一般编码格式 指令条件码
第二讲 ARM指令集
一般编码格式
每条ARM指令占有4个字节,其指令长度为32位
[转]ARM指令集详解[很好]
![[转]ARM指令集详解[很好]](https://img.taocdn.com/s3/m/65af3afc541810a6f524ccbff121dd36a32dc4e6.png)
[转]ARM指令集详解[很好]1. 汇编1.1. 通⽤寄存器通⽤寄存器37个寄存器,31个通⽤寄存器,6个状态寄存器,R13堆栈指针sp,R14返回指针,R15为PC 指针, cpsr_c代表的是这32位中的低8位,也就是控制位CPSR有4个8位区域:标志域(F)、状态域(S)、扩展域(X)、控制域(C)MSR - Load specified fields of the CPSR or SPSR with an immediate constant, orfrom the contents of a general-purpose register. Syntax: MSR{cond} _, #immed_8rMSR{cond} _, Rm where: cond is an optional condition code. is either CPSR orSPSR. specifies the field or fields to be moved. can be one or more of: ccontrol field mask byte (PSR[7:0]) x extension field mask byte (PSR[15:8]) sstatus field mask byte (PSR[23:16) f flags field mask byte(PSR[31:24]).immed_8r is an expression evaluating to a numeric constant. The constant mustcorrespond to an 8-bit pattern rotated by an even number of bits within a32-bit word. Rm is the source register.C 控制域屏蔽字节(psr[7:0])X 扩展域屏蔽字节(psr[15:8])S 状态域屏蔽字节(psr[23:16])F 标志域屏蔽字节(psr[31:24])CPSR寄存器FIQ和IRQ的区别?MODE(以下为⼆进制)10000⽤户模式PC,CPSR,R0~R1410001FIQ PC,CPSR,SPSR_fiq,R14_fiq~R8_fiq,R7~R010010IRQ PC,CPSR,SPSR_irq,R14_irq~R13_irq,R12~R010011管理模式(svc)PC,CPSR,SPSR_svc,R14_svc~R13_svc,R12~R010111终⽌模式PC,CPSR,SPSR_abt,R14_abt~R13_abt,R12~R011011未定义PC,CPSR,SPSR_und,R14_und~R13_und,R2~R011111系统模式(sys)PC,CPSR,R14 ~R01.2. 指令格式1) 基本格式<opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>}其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,⽽{<cond>}为指令执⾏条件,是可选的,如果不写则使⽤默认条件AL(⽆条件执⾏)。
第三章 ARM指令集

只有能够通过此构造方法得到的才是合法的立即数。 合法立即数:
0xFF;0x104;0xFF0;0xFF00
非法立即数: 0x101;0x102;0xFF1
一个合法的立即数可能有多种编码方法,将使某些指令的执 行产生不同的结果。
0x3F0
immed_8=0x3F,rot=0xE immed_8=0xFC,rot=0xF
寄存器R1的内容分别逻辑右移2位、R4位,再 与寄存器R2的内容相加,结果放入R3中。
2.3 寄存器间接寻址
寄存器间接寻址 ——就是以寄存器中的值作为操作数的地址,而操 作数本身存放在存储单元中。例如以下指令: LDR STR R0,[R1] R0,[R1] ;R0←mem32[R1] ; mem32[R1]←R0
操作码 0000 0001
条件助记符 EQ NE
标志 Z=1 Z=0 相等 不相等
含义
0010
0011 0100 0101
CS/HS
CC/LO MI PL
C=1
C=0 N=1 N=0
无符号数大于或等于
无符号数小于 负数 正数或零
0110
0111 1000 1001
VS
VC HI LS
V=1
V=0 C=1,Z=0 C=0,Z=1
Cond
001
Opcode S
Rn
Rd
Operand2
一条典型的ARM指令语法格式为: <Opcode>{<cond>}{s} <Rd>, <Rn>{, <Operand2>} Opcode:指令操作码。 cond:指令的条件码。 S:决定指令的操作是否影响cpsr的值。 Rd:目标寄存器。 Rn:包含第一个操作数的寄存器。 Operand2:第2操作数。 例:ADDS R2,R1,#1
ARM指令集

PC+4
1
DABT SUBS PC,R14_abt,#8
PC+8
PC+8
3
RESET NA
-
-
4
备注: 1--在此PC应是具有预取中止的BL/SWI/未定义指令所取的地址。 2--在此PC是从FIQ或IRQ取得不能执行的指令的地址。 3--在此PC是产生数据中止的加载或存储指令的地址。 4--系统复位时,保存在R14_svc中的值是不可预知的。
ARM指令集
2020年7月11日星期六
5.1 引言--ARM指令与Thumb指令
ARM处理器是基于精简指令集计算机(RISC)原理 设计的,指令集和相关译码机制较为简单。一些 ARM核具有32位ARM指令集和16位Thumb指令集 。
ARM指令集效率高,但是代码密度低;
而Thumb指令集具有较高的代码密度,却仍然保持ARM 的大多数性能上的优势,它是ARM指令集的子集。
指令预取中止 若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器 发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。
数据中止
若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中 止异常。
IRQ(外部中 当处理器的外部中断请求引脚有效,且CPSR中的I位为0时,产生IRQ异常。系统的外 断请求) 设可通过该异常请求中断服务。
所有的ARM指令都是可以有条件执行的,而Thumb指令 仅有一条指令具备条件执行功能。
ARM程序和Thumb程序可相互调用,相互之间的状态切 换开销几乎为零。
ARM指令集与Thumb指令集的关系
ARM指令集支持 ARM核所有的特 性,具有高效、 快速的特点
Thumb指令集 具有灵活、小 巧的特点
实用ARM指令全

在讲指令之前,先简单地介绍一下Cortex-M3 中支持的算术与逻辑标志。
本书在后面还会展开论述。
它们是:APSR 中的5 个标志位4.2.1 分类指令表表4.2 16位数据操作指令表4.3 16位转移指令IT If-Then表4.4 16位存储器数据传送指令16 数据传送指令没有任何新内容,因为它们是Thumb 指令,在v4T 时就已经定格了——译注表4.5 其它16位指令表4.6 32位数据操作指令UXTH 半字被无符号扩展到32 位(高16 位清0——译注)表4.7 32位存储器数据传送指令表4.8 32位转移指令表4.9 其它32位指令4.2.2 未支持的指令有若干条Thumb 指令没有得到Cortex-M3 的支持,下表列出了未被支持的指令,以及不支持的原因。
表4.10 因为不再是传统的架构,导致有些指令已失去意义未支持的指令以前的功能BLX #im 在使用立即数做操作数时,BLX 总是要切入ARM 状态。
因为Cortex-M3 只在Thumb 态下运行,故以此指令为代表的,凡是试图切入ARM 态的操作,都将引发一个用法fault。
SETEND由ARMv6 引入的,在运行时改变处理器端设置的指令(大端或小端)。
因为Cortex-M3 不支持动态端的功能,所以此指令也将引发faultCM3 也不支持有少量在ARMv7-M 中列出的指令。
比如,ARMv7M 支持Thumb2 的协处理器指令,但是CM3 却不能挂协处理器。
表4.11 列出了这些与协处理器相关的指令。
如果试图执行它们,则将引发用法fault(NVIC 中的NOCP (No CoProcessor)标志置位)。
表4.11 不支持的协处理器相关指令未支持的指令以前的功能MCR 把通用寄存器的值传送到协处理器的寄存器中MCR2把通用寄存器的值传送到协处理器的寄存器中MCRR 把通用寄存器的值传送到协处理器的寄存器中,一次操作两个MRC把协处理器寄存器的值传送到通用寄存器中MRC2 把协处理器寄存器的值传送到通用寄存器中MRRC把协处理器寄存器的值传送到通用寄存器中,一次操作两个LDC 把某个连续地址空间中的一串数值传送至协处理器中STC从协处理器中传送一串数值到地址连续的一段地址空间中还有一个是改变处理器状态指令(CPS),它的一些用法也不再支持。
ARM指令集

ARM寻址方式
立即寻址 寄存器寻址
第2操作数为寄存器型的移位操作 第2操作数移位方式 第2操作数的移位位数
寄存器间接寻址 基址加偏址寻址
前变址模式 自动变址模式 后变址模式 偏移地址 传送数据类型
堆栈寻址 块拷贝寻址 相对寻址
ARM指令详细介绍
数据处理指令 Load/Store指令 状态寄存器与通用寄存器之间的传送指令 转移指令 异常中断产生指令 协处理器指令 未使用的指令空间
指令分类及指令格式
指令分类简述
数据处理指令、Load/Store指令、跳转指令、程序状 态寄存器处理指令、协处理器指令、异常产生指令
指令格式
<opcode>{<cond>}{S} <Rd>,<Rn>{,<operand2>}
基本指令格式说明 opcode(操作码),cond(可选的条件码),S (可选后缀),Rd(目标寄存器),Rn(存放 第一操作数的寄存器),operand2(第2个操作 数)
数据处理指令
ADD、ADC、SUB、RSB、SBC和RSB AND、ORR、EOR和BIC MOV和MVN CMP和CMN TST和TEQ 乘法指令
Load/Store指令
单寄存器存取指令 多寄存器存取指令 存储器和寄存器交换指令SWP
状态寄存器与通用寄存器之间的传送 指令
状态寄存器到通用寄存器的传送指令 MRS 通用寄存器到状态寄存器的传送指令 MSR
转移指令
转移和转移链接指令(B、BL) 转移交换和转移链接交换(BX、BLX)
异常中断产生指令
软件中断指令SWI 断点指令(BK的数据操作 协处理器的数据存取 协处理器的寄存器传送
三、ARM指令集

IMPORT用于表示引 用于表示引 进外部其他文件的变 量程序标号等。 量程序标号等。 EXPORT表示后面 表示后面 的变量标号等是公共 的,外部其他文件的 程序也可以看见并使 用。
EXPORT Reset EXPORT __user_initial_stackheap
CODE32 AREA表示是一个区 表示是一个区 AREA vectors,CODE,READONLY 可以是代码, 域,可以是代码,也 ENTRY 可以是数据, 可以是数据,由跟在 ;中断向量表 中断向量表 后面的第二个参数决 Reset 这里的CODE 定 ,这里的 LDR PC, ResetAddr 表明这是一个代码区 LDR PC, UndefinedAddr 域。 LDR PC, SWI_Addr LDR PC, PrefetchAddr 第一个参数是表示这 LDR PC, DataAbortAddr 个区域的名字, 个区域的名字,可以 DCD 0xb9205f80 任意给定。 任意给定。 LDR PC, [PC, #-0xff0] LDR PC, FIQ_Addr ENTRY是表示是程 是表示是程 ResetAddr DCD ResetInit 序的入口, 序的入口,一个程 UndefinedAddr DCD Undefined 序可以有很多入口, SWI_Addr DCD SoftwareInterrupt 序可以有很多入口, PrefetchAddr DCD PrefetchAbort 需要编译器指定初
常用的指令
需要认真掌握的指令有: 需要认真掌握的指令有: MOV AND SUB ADD CMP ORR BIC LDR STR B BL MRS MSR
以上指令的具体使用请参考教科书第二章
ARM指令需要注意的知识点 指令需要注意的知识点
ARM指令

堆栈指针指向下一个要放入数据的空位置
5.ARM指令集
(1)跳转指令
B指令: B{条件} 目的地址
B指令是最简单的跳转指令。
如: B Label ;无条件跳到Label处执行
如:MOV R1,R0
MOV PC,R14 ;将寄存器R14的值传送到PC,常用于子程序返回
MOV R1,R0,LSL#3 ;将寄存器R0的值左移三位然后传送到R1
MVN{条件}{S} 目的寄存器,源操作数
当未定义的指令执行时进入该模式,可用于支持硬件
说明:除用户模式,其他的称为特权模式或非用户模式
除用户模式和系统模式,其他的又被称为异常模式,常用于处理中断和 要访问受保护的系统资源等情况。
2.寄存器
1.说明:ARM有37个32寄存器,其中31个为通用寄存器,6个位状态寄存器,可访问情况取决ARM工作模式及状态,通用寄存器R14-R0,程序计数器PC,一个状态寄存器都可访问。
AND指令把操作数1与操作数2的逻辑与结果放入目的寄存器,操作数1应 是一个寄存器,操作数2可以是寄存器或者被移位的寄存器,或者立即 数,ADD和SUB也一样。
ORR指令和AND差不多,ORR是逻辑或运算
0b10001 FIQ PC,R14_FIQ-R8_FIQ,R7~R0,CPSR,SPSR_FIQ
0b10010 IRQ PC,R14_IRQ-R13_IRQ,R12~R0,CPSR,SPSR_IRQ
0B10011 SUPERVISOR PC,R14_SVC-R13_SVC,R12~R0,CPSR,SPSR_SVC
(3)寄存器间接寻址
以寄存器中的数作为操作数中的地址,而操作数本身存放在存储器中
ARM指令集详解(超详细!带实例!)

ARM指令集详解(超详细!带实例!)ADC : 带进位的加法(Ad dition with C arry)ADC{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 + op_2 + carryADC 将把两个操作数加起来,并把结果放置到目的寄存器中。
它使用一个进位标志位,这样就可以做比 32 位大的加法。
下列例子将加两个 128 位的数。
128 位结果: 寄存器 0、1、2、和 3第一个 128 位数: 寄存器 4、5、6、和 7第二个 128 位数: 寄存器 8、9、10、和 11。
ADDS R0, R4, R8 ; 加低端的字ADCS R1, R5, R9 ; 加下一个字,带进位ADCS R2, R6, R10 ; 加第三个字,带进位ADCS R3, R7, R11 ; 加高端的字,带进位如果如果要做这样的加法,不要忘记设置S 后缀来更改进位标志。
ADD : 加法(Add ition)ADD{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 + op_2ADD 将把两个操作数加起来,把结果放置到目的寄存器中。
操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:ADD R0, R1, R2 ; R0 = R1 + R2ADD R0, R1, #256 ; R0 = R1 + 256ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 << 1)加法可以在有符号和无符号数上进行。
AND : 逻辑与(logical AND)AND{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 AND op_2AND 将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。
ARM指令集介绍精品文档17页

ARM指令集ARM(Advanced RISC Machines)是微处理器行业的一家知名企业。
设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。
1985年,第一个ARM原型在英国剑桥诞生。
ARM公司的特点是只设计芯片,而不生产。
ARM将其技术授权给世界上许多著名的半导体、软件和OEM厂商,每个厂商得到的都是一套独一无二的ARM相关技术及服务。
利用这种合伙关系,ARM很快成为许多全球性RISC标准的缔造者。
ARM公司定义了6种主要的指令集体系结构版本。
V1---V6。
ARMV1:该版本的原型机是ARM1,没有用于商业产品。
ARMV2:对V1版进行了扩展,包含了对32位结果的乘法指令和协处理器指令的支持。
ARMV3:ARM公司第一个微处理器ARM6核心是版本3的,它作为IP核、独立的处理器、具有片上高速缓存、MMU和写缓冲的集成CPU。
ARMV4:当前应用最广泛的ARM指令集版本。
ARM7TDMI、ARM720T、ARM9TDMI、ARM940T、ARM920T、Intel的StrongARM等是基于ARMv4T 版本。
ARMv5:ARM9E-S、ARM966E-S、ARM1020E、ARM 1022E以及XScale是ARMv5TE的。
ARM9EJ-S、ARM926EJ-S、ARM7EJ-S、ARM1026EJ-S是基于ARMv5EJ的。
ARM10也采用。
其中后缀意义如下:E:增强型DSP指令集。
包括全部算法和16位乘法操作。
J:支持新的Java。
ARMv6:采用ARMv6核的处理器是ARM11系列。
ARM1136J(F)-S基于ARMv6主要特性有SIMD、Thumb、Jazelle、DBX、(VFP)、MMU。
ARM1156T2(F)-S基于ARMv6T2 主要特性有SIMD、Thumb-2、(VFP)、MPU。
ARM1176JZ(F)-S基于ARMv6KZ 在ARM1136EJ(F)-S 基础上增加MMU、TrustZone。
必须知道的ARM指令集

常用的ARM指令集我们知道CPU能直接识别的是机器码,也就是0和1组合的东东。
不同的组合代表不同的含义,CPU就做不同的事情。
按照道理来说,我们写的代码都应该是0和1组成的东西,但是如果真的是那样,那结果....。
人类是聪明的,发明了汇编语言,汇编语言是用一些助记符,来代替机器码。
当然,汇编语言是不能给CPU识别的,需要编译器将其编译成机器码。
汇编语言是和特定的CPU关联的,不同的CPU对应不同的汇编指令。
好在,现在大多数嵌入式CPU都是使用ARM架构的,这样我们只需要学会ARM的汇编指令集,我们写的汇编程序就可以在这些使用ARM架构的CPU上运行。
ARM的汇编指令很多,很难将其全部记住,其实也没必要,我们只需要学会一些常用的ARM汇编指令即可。
其他的用到再去查即可。
下面我们就开始,必须知道的ARM指令学习。
一、ARM指令格式ARM指令的基本格式如下:其中<>号内是必须的,{}号内的项是可选的。
各项的说明如下:opcode :指令助记符cond :执行条件S :是否影响CPSR寄存器的值Rd :目标寄存器(一般用来存放指令执行最后的结果)Rn :第1个操作数的寄存器operand2 :第2个操作数1. 其中,我们必须要研究一下operand2这个操作数,它有如下表现形式(1)#immed_8r——常数表达式该常数必须对应8位位图,即一个8位的常数通过循环右移偶数位得到,这个数我们也成立即数。
例如:MOV R0,#1AND R1,R2,#0x0例如:0x04800000它可以拿0x12循环右移位10位得到,所以它是一个合法的立即数。
有人会问,是不是每次我都要去判断一个数是不是立即数,我就需要从0x00~0xff里面找出一个数,将它循环右移偶数个位看是否能的得到,那太麻烦了。
有没有一些快速识别的方法呢?肯定是有的呀,当然也不能完全依赖哦,最好就是拿编译器验证,不是,编译器就会报错。
如何判断一个数是否是合法立即数?首先将这个数转换为32bit 16进制形式,例如218=0xDA=0x000000DA1.除零外,仅有一位数为合法立即数。
ARM汇编指令集详解

ARM汇编指令集一、跳转指令跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转:Ⅰ.使用专门的跳转指令。
Ⅱ.直接向程序计数器PC写入跳转地址值。
通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。
ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:1、B指令B指令的格式为:B{条件} 目标地址B指令是最简单的跳转指令。
一旦遇到一个B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。
注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。
它是24 位有符号数,左移两位后有符号扩展为32 位,表示的有效偏移为26 位(前后32MB的地址空间)。
以下指令:B Label ;程序无条件跳转到标号Label处执行CMP R1,#0 ;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label 处执行BEQ Label2、BL指令BL指令的格式为:BL{条件} 目标地址BL 是另一个跳转指令,但跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14 的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。
该指令是实现子程序调用的一个基本但常用的手段。
以下指令:BL Label ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中3、BLX指令BLX指令的格式为:BLX 目标地址BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM 状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。
因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态的切换。
ARM指令集详解(超详细!带实例!)

ARM指令集详解(超详细!带实例!)算术和逻辑指令ADC : 带进位的加法(Ad dition with C arry)ADC{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 + op_2 + carryADC 将把两个操作数加起来,并把结果放置到⽬的寄存器中。
它使⽤⼀个进位标志位,这样就可以做⽐ 32 位⼤的加法。
下列例⼦将加两个 128 位的数。
128 位结果: 寄存器 0、1、2、和 3第⼀个 128 位数: 寄存器 4、5、6、和 7第⼆个 128 位数: 寄存器 8、9、10、和 11。
ADDS R0, R4, R8 ; 加低端的字ADCS R1, R5, R9 ; 加下⼀个字,带进位ADCS R2, R6, R10 ; 加第三个字,带进位ADCS R3, R7, R11 ; 加⾼端的字,带进位如果如果要做这样的加法,不要忘记设置 S 后缀来更改进位标志。
这两个指令与普通指令在对操作数的限制上有所不同:1. 给出的所有操作数、和⽬的寄存器必须为简单的寄存器。
2. 你不能对操作数 2 使⽤⽴即值或被移位的寄存器。
3. ⽬的寄存器和操作数 1 必须是不同的寄存器。
4. 最后,你不能指定 R15 为⽬的寄存器。
译注:CMP 和 CMP 是算术指令,TEQ 和 TST 是逻辑指令。
把它们归⼊⼀类的原因是它们的 S 位总是设置的,就是说,它们总是影响标志位。
CMN : ⽐较取负的值(C o m pare N egative)CMN{条件}{P} <op 1>, <op 2>status = op_1 - (- op_2)CMN 同于 CMP,但它允许你与⼩负值(操作数 2 的取负的值)进⾏⽐较,⽐如难于⽤其他⽅法实现的⽤于结束列表的 -1。
这样与 -1 ⽐较将使⽤:CMN R0, #1 ; 把 R0 与 -1 进⾏⽐较详情参照 CMP 指令。
03ARM指令集

(5)堆栈寻址
当 SP 指向最后压入堆栈的数据时,称为满堆栈 (Full Stack),而当 SP 指向下一个将要放入数据的 空位置时,称为空堆栈(Empty Stack);
入栈时,SP 向高地址方向变化,称为递增堆栈 (Ascending Stack);SP 向低地址方向变化,称为递 减堆栈(Descending Stack)。
1、ARM 指令集概述
ARM指令集是32位的,程序的启动都是从ARM 指令开始;所有的ARM指令集都可以是可以条件执 行的。
从以下三个方面介绍: ① 指令集编码 ② 条件执行 ③ 指令分类及指令格式
① 指令集编码
ARM指令集是以32位二进制编码的方式给出的, 大部分的指令编码中定义了第一操作数、第二操作数、 目的操作数、条件标志影响位以及每条指令所对应的 不同功能实现的二进制位。
乘法指令的二进制编码: 乘法指令的详细列表:
(2)Load/Store 指令
唯一用于寄存器和存储器之间进行数据传送的指令:
单寄存器的存取指令(LDR,STR) 多寄存器存取指令(LDM,STM) 单寄存器交换指令(SWP)
LDR/STR:单字和无符号字节的数据传送指令 前变址格式
LDR|STR {<cond>}{B} Rd,[Rn,<offset>]{!} 后变址格式
(1)立即寻址
操作数本身就在指令中给出,只要取出指令也就
取到了操作数,这个操作数被称为立即数,对应的寻
址方式也就叫做立即寻址。例如以下指令:
ADD R0,R0,#1
;R0←R0+1
ADD R0,R0,#0x3f ;R0←R0+0x3f
以上两指令中第二个源操作数即为立即数,要求 以“#”为前缀并声明其进制,如 0x、0d、0b等。
第九讲 ARM指令集

LDR BEQ ADDS
R0,[R1] DATAEVEN R2,R1,#1
;读取R1地址上的存储器单元内容,传送给R0(ALL); ;条件执行分支指令(EQ),即相等则跳转到DATAEVEN; ;加法指令,R2=R1+1,影响CPSR寄存器(S);
SUBNES R2,R1,#0x20;条件执行减法运算(NE),R2=R1-0x20,影响CPSR寄存器(S)。
由是观之,指令中的立即数是由指令编码中的后12位间接表示的,其中最后8位[7: 0]为immed_8,前4位[11:8]为rotate_immed_4。 而0x0101、0x0102、0xFF1000等常数不是合法的立即数。 显然,8位立即数都是合法的立即数,不需要经过移位间接表示,可以直接表9.1.3 指令分类及指令格式
ARM指令集是Load/Store型的,只能通过Load/Store指令实现对系统存储器的访 问,而其它的指令是基于处理器内部的寄存器操作完成。 ARM指令集可分为6大类:
数据处理指令; Load/Store指令; 跳转指令; 程序状态寄存器处理指令; 协处理器指令;
9.1 ARM指令集概述
9.1.1 ARM指令集编码 ARM指令集是以32位二进制编码的方式给出的,大部分的指令编码中定 义了第一操作数、第二操作数、目的操作数、条件标志影响位以及每条指令 所对应的不同功能实现的二进制位。每条32位ARM指令都具有不同的二进 制编码方式,与不同的指令功能相对应。如下图。
第九讲 ARM指令集
第九讲 ARM指令集
9.1.2 条件执行
在ARM的指令编码表中,最高4位[31:28]表示条件码(cond),每种条件用两个 英文缩写字符表示其含义,可添加在指令助记符的后面,表示指令执行时必须要满 足的条件。ARM指令根据CPSR中的条件位(NZCV)自动判断是否执行指令。条件 满足时指令执行,条件不满足时指令被忽略(相当于执行了一条NOP伪指令)。条 件码编码表见下表。
《ARM指令集》课件

3
2000年代至今
随着移动设备的普及,ARM指令集在智能手机 、平板电脑等领域得到广泛应用。
ARM指令集的特点和优势
低功耗
ARM指令集以其低功耗特性而闻名,适合于移动设备和嵌入式系统。
高性能
ARM指令集采用精简的指令集设计,使得处理器能够快速执行指令,提高性能。
ARM指令集还支持流水线技术,即将一条指令的执行分为取指、译码、执行、存回等多个阶段,以提高 程序的执行效率。
03
ARM指令集的编程实践
ARM指令集在汇编语言中的应用
01
ARM指令集在汇编语言中主要用于编写低级程序,如操作系统内核、 驱动程序等。
02
ARM指令集提供了丰富的控制和数据处理指令,使得汇编语言能够高 效地控制硬件和执行复杂的数据处理任务。
01
指令级并行
在同一时钟周期内,处理多条指令 。
线程级并行
利用多线程并行执行,提高整体性 能。
03
02
数据级并行
对数据进行分组处理,提高处理速 度。
任务级并行
将复杂任务分解为多个子任务,并 行执行。
04
ARM指令集的功耗优化技术
动态电压频率调节
根据实际需求调整电压和频率,降低功耗。
低功耗模式
在空闲或低负载时,进入低功耗模式,降低 功耗。
易于移植
ARM指令集具有良好的可移植性,使得软件在不同ARM处理器之间易于移植。
开放架构
ARM指令集采用开放架构,允许厂商根据需求进行定制和扩展。
ARM指令集的应用领域
智能手机
ARM指令集广泛应用于智能 手机领域,包括苹果、三星
、华为等知名品牌。
ARM指令集讲解

ARM指令集讲解ARM指令和指令系统:指令是指示计算机某种操作的命令,指令的集合称为指令系统。
指令系统的功能强弱很大程度上决定了这类计算机智能的高低,它集中地反应了微处理器的硬件功能和属性。
ARM指令在机器中的表示格式是用32位的二进制数表示。
如ARM中有一条指令为ADDEQS R0,R1,#8;其二进制代码形式为:31~28 | 27~25 | 24~21 | 20 | 19~16 | 15~12 | 11~0 0000 | 001 | 0100 | 1 | 0001 | 0000 | 0000 0000 1000cond | opcode | Rn | Rd | Op2ARM指令格式一般如下:{}{s},{,}格式中< >的内容是必不可少的,{ }中的内容可忽略表示操作码。
如ADD表示算术加法{} 表示指令执行的条件域。
如EQ、NE等,缺省为AL。
{S} 决定指令的执行结果是否影响CPSR的值,使用该后缀则指令执行结果影响CPSR的值,否则不影响表示目的寄存器表示第一个操作数,为寄存器表示第二个操作数,可以是立即数。
寄存器和寄存器移位操作数ARM指令后缀:S、!S后缀:指令中使用S后缀时,指令执行后程序状态寄存器的条件标志位将被刷新,不使用S后缀时,指令执行后程序状态寄存器的条件标志将不会发生变化。
S后缀常用于对条件进行测试,如是否有溢出,是否进位等,根据这些变化,就可以进行一些判断,如是否大于,相等,从而影响指令执行的顺序。
!后缀:如果指令地址表达式中不含!后缀,则基址寄存器中的地址值不会发生变化。
加上此后缀后,基址寄存器中的值(指令执行后)= 指令执行前的值+ 地址偏移量(1)!后缀必须紧跟在地址表达式后面,而地址表达式要有明确的地址偏移量(2)!后缀不能用于R15(PC)的后面(3)当用在单个地址寄存器后面时,必须确信这个寄存器有隐性的偏移量,例如“STMDB R1!,{R3,R5,R7}”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算术和逻辑指令ADC : 带进位的加法(Ad dition with C arry)ADC{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 + op_2 + carryADC将把两个操作数加起来,并把结果放置到目的寄存器中。
它使用一个进位标志位,这样就可以做比32 位大的加法。
下列例子将加两个128 位的数。
128 位结果: 寄存器0、1、2、和3第一个128 位数: 寄存器4、5、6、和7第二个128 位数: 寄存器8、9、10、和11。
ADDS R0, R4, R8 ; 加低端的字ADCS R1, R5, R9 ; 加下一个字,带进位ADCS R2, R6, R10 ; 加第三个字,带进位ADCS R3, R7, R11 ; 加高端的字,带进位如果如果要做这样的加法,不要忘记设置S 后缀来更改进位标志。
ADD : 加法(Add ition)ADD{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 + op_2ADD将把两个操作数加起来,把结果放置到目的寄存器中。
操作数 1 是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即值:ADD R0, R1, R2 ; R0 = R1 + R2ADD R0, R1, #256 ; R0 = R1 + 256ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 << 1)加法可以在有符号和无符号数上进行。
AND : 逻辑与(logical AND)AND{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 AND op_2AND将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。
操作数1 是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即值:AND R0, R0, #3 ; R0 = 保持 R0 的位0和 1,丢弃其余的位。
AND 的真值表(二者都是1 则结果为1):Op_1 Op_2 结果0 0 00 1 01 0 01 1 1BIC : 位清除(Bi t C lear)BIC{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 AND (!op_2)BIC是在一个字中清除位的一种方法,与OR 位设置是相反的操作。
操作数2 是一个32 位位掩码(mask)。
如果如果在掩码中设置了某一位,则清除这一位。
未设置的掩码位指示此位保持不变。
BIC R0, R0, #%1011 ; 清除 R0 中的位 0、1、和 3。
保持其余的不变。
BIC 真值表:Op_1 Op_2 结果0 0 00 1 01 0 11 1 0译注:逻辑表达式为 Op_1 AND NOT Op_2EOR : 逻辑异或(logical E xclusive OR)EOR{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 EOR op_2EOR将在两个操作数上进行逻辑异或,把结果放置到目的寄存器中;对反转特定的位有用。
操作数1 是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即值:EOR R0, R0, #3 ; 反转 R0 中的位 0 和 1EOR 真值表(二者不同则结果为1):Op_1 Op_2 结果0 0 00 1 11 0 11 1 0MOV : 传送(Mov e)MOV{条件}{S} <dest>, <op 1>dest = op_1MOV从另一个寄存器、被移位的寄存器、或一个立即值装载一个值到目的寄存器。
你可以指定相同的寄存器来实现NOP 指令的效果,你还可以专门移位一个寄存器:MOV R0, R0 ; R0 = R0... NOP 指令MOV R0, R0, LSL#3 ; R0 = R0 * 8如果R15 是目的寄存器,将修改程序计数器或标志。
这用于返回到调用代码,方法是把连接寄存器的内容传送到R15:MOV PC, R14 ; 退出到调用者MOVS PC, R14 ; 退出到调用者并恢复标志位(不遵从 32-bit 体系)MVN : 传送取反的值(M o v e N egative)MVN{条件}{S} <dest>, <op 1>dest = !op_1MVN从另一个寄存器、被移位的寄存器、或一个立即值装载一个值到目的寄存器。
不同之处是在传送之前位被反转了,所以把一个被取反的值传送到一个寄存器中。
这是逻辑非操作而不是算术操作,这个取反的值加1 才是它的取负的值:MVN R0, #4 ; R0 = -5MVN R0, #0 ; R0 = -1ORR : 逻辑或(logical OR)ORR{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 OR op_2OR将在两个操作数上进行逻辑或,把结果放置到目的寄存器中;对设置特定的位有用。
操作数1 是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即值:ORR R0, R0, #3 ; 设置 R0 中位 0 和 1OR 真值表(二者中存在1 则结果为1):Op_1 Op_2 结果0 0 00 1 11 0 11 1 1RSB : 反向减法(R everse S u b traction)RSB{条件}{S} <dest>, <op 1>, <op 2>dest = op_2 - op_1SUB用操作数two 减去操作数one,把结果放置到目的寄存器中。
操作数1 是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即值:RSB R0, R1, R2 ; R0 = R2 - R1RSB R0, R1, #256 ; R0 = 256 - R1RSB R0, R2, R3,LSL#1 ; R0 = (R3 << 1) - R2反向减法可以在有符号或无符号数上进行。
RSC : 带借位的反向减法(R everse S ubtraction with C arry)RSC{条件}{S} <dest>, <op 1>, <op 2>dest = op_2 - op_1 - !carry同于SBC,但倒换了两个操作数的前后位置。
SBC : 带借位的减法(S u b traction with C arry)SBC{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 - op_2 - !carrySBC做两个操作数的减法,把结果放置到目的寄存器中。
它使用进位标志来表示借位,这样就可以做大于32 位的减法。
SUB和SBC生成进位标志的方式不同于常规,如果需要借位则清除进位标志。
所以,指令要对进位标志进行一个非操作- 在指令执行期间自动的反转此位。
SUB : 减法(Sub traction)SUB{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 - op_2SUB用操作数one 减去操作数 two,把结果放置到目的寄存器中。
操作数1 是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即值:SUB R0, R1, R2 ; R0 = R1 - R2SUB R0, R1, #256 ; R0 = R1 - 256SUB R0, R2, R3,LSL#1 ; R0 = R2 - (R3 << 1)减法可以在有符号和无符号数上进行。
移位指令ARM 处理器组建了可以与数据处理指令(ADC、ADD、AND、BIC、CMN、CMP、EOR、MOV、MVN、ORR、RSB、SBC、SUB、TEQ、TST)一起使用的桶式移位器(barrel shifter)。
你还可以使用桶式移位器影响在LDR/STR 操作中的变址值。
译注:移位操作在ARM 指令集中不作为单独的指令使用,它是指令格式中是一个字段,在汇编语言中表示为指令中的选项。
如果数据处理指令的第二个操作数或者单一数据传送指令中的变址是寄存器,则可以对它进行各种移位操作。
如果数据处理指令的第二个操作数是立即值,在指令中用8 位立即值和4 位循环移位来表示它,所以对大于255 的立即值,汇编器尝试通过在指令中设置循环移位数量来表示它,如果不能表示则生成一个错误。
在逻辑类指令中,逻辑运算指令由指令中S 位的设置或清除来确定是否影响进位标志,而比较指令的S 位总是设置的。
在单一数据传送指令中指定移位的数量只能用立即值而不能用寄存器。
下面是给不同的移位类型的六个助记符:LSL 逻辑左移ASL 算术左移LSR 逻辑右移ASR 算术右移ROR 循环右移RRX 带扩展的循环右移ASL和LSL是等同的,可以自由互换。
你可以用一个立即值(从0 到31)指定移位数量,或用包含在0 和31 之间的一个值的寄存器指定移位数量。
逻辑或算术左移(L ogical or A rithmetic S hift L eft)Rx, LSL #n orRx, ASL #n orRx, LSL Rn orRx, ASL Rn接受Rx 的内容并按用‘n’或在寄存器Rn 中指定的数量向高有效位方向移位。
最低有效位用零来填充。
除了概念上的第33 位(就是被移出的最小的那位)之外丢弃移出最左端的高位,如果逻辑类指令中S 位被设置了,则此位将成为从桶式移位器退出时进位标志的值。
考虑下列:MOV R1, #12MOV R0, R1, LSL#2在退出时,R0 是48。
这些指令形成的总和是R0 = #12, LSL#2等同于BASIC 的R0 = 12 << 2逻辑右移(L ogical S hift R ight)Rx, LSR #n orRx, LSR Rn它在概念上与左移相对。
把所有位向更低有效位方向移动。
如果逻辑类指令中S 位被设置了,则把最后被移出最右端的那位放置到进位标志中。
它同于BASIC 的register = value >>> shift。
算术右移(A rithmetic S hift R ight)Rx, ASR #n orRx, ASR Rn类似于LSR,但使用要被移位的寄存器(Rx)的第31 位的值来填充高位,用来保护补码表示中的符号。