ARM指令集详解(超详细!带实例!)

合集下载

第二讲ARM指令集课件

第二讲ARM指令集课件
S用于恢复CPSR和强制用户位。当程序计数器 PC包含在LDM指令的register_list中,且S为1时, 则当前模式的SPSR被拷贝到CPSR中,使处理器 的程序返回和状态的恢复成为一个原子操作。如 果register_list中不包含程序计数器PC,S为1则 加载或存储的是用户模式下的寄存器组。
第二讲 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指令集详解[很好]

[转]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指令集

ARM指令集

ARM指令集6种类型(53种主要助记符):数据处理指令(22种主要助记符)跳转指令(4种主要助记符)Load/Store指令(16种主要助记符)程序状态寄存器指令(2种主要助记符)协处理器指令(5种主要助记符)软件中断指令(2种主要助记符)数据处理指令数据处理指令大致可分为3类:数据传送指令;算术逻辑运算指令;乘法指令比较指令。

数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。

所有ARM数据处理指令均可选择使用S后缀,并影响状态标志。

数据处理指令1MOV 数据传送指令格式:MOV{<cond>}{S} <Rd>,<op1>;功能:Rd=op1op1可以是寄存器、被移位的寄存器或立即数。

例如:MOV R0,#5 ;R0=5MOV R0,R1 ;R0=R1MOV R0,R1,LSL#5 ;R0=R1左移5位数据处理指令22.MVN 数据取反传送指令格式:MVN{<cond>}{S} <Rd>,<op1>;功能:将op1表示的值传送到目的寄存器Rd中,但该值在传送前被按位取反,即Rd=!op1;op1可以是寄存器、被移位的寄存器或立即数。

例如:MVN R0,#0 ;R0=-1数据处理指令33.ADD 加法指令格式:ADD{<cond>}{S} <Rd>,<Rn>,<op2>;功能:Rd=Rn+op2op2可以是寄存器,被移位的寄存器或立即数。

例如:ADD R0,R1,#5 ;R0=R1+5ADD R0,R1,R2 ;R0=R1+R2ADD R0,R1,R2,LSL#5 ;R0=R1+R2左移5位数据处理指令44.ADC 带进位加法指令格式:ADC{<cond>}{S} <Rd>,<Rn>,<op2>;功能:Rd=Rn+op2+carryop2可以是寄存器、被移位的寄存器或立即数;carry为进位标志值。

ARM指令集

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指令全

实用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指令集

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指令集

三、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指令

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)寄存器间接寻址
以寄存器中的数作为操作数中的地址,而操作数本身存放在存储器中
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 位的值来填充高位,用来保护补码表示中的符号。

相关文档
最新文档