ARM指令集详解
ARM指令集

ARM寻址方式与指令系统ARM编程模型ARM指令格式和寻址方式ARM指令集Thumb指令集机器指令、伪指令和宏指令机器指令:能被处理器直接执行,而伪指令宏和宏指令不能。
机器指令包括ARM指令集和Thumb指令集;伪指令:在源程序汇编期间,由汇编编译器处理。
其作用是为汇编程序完成准备工作;宏指令:在程序中用于调用宏,宏是一段独立的程序代码;在程序汇编时,对宏调用进行展开,用宏体代替宏指令。
ARM处理器模式ARM微处理器支持7种工作模式:用户模式、系统模式、快速中断模式、外部中断模式、管理模式、中止模式、未定义指令模式。
除用户模式之外的其余6种称为非用户模式,或特权模式。
在特权模式中,除系统模式之外的其余5种称为异常模式。
处理器的各种工作模式由当前程序状态寄存器CPSR的低5位M[4:0]决定。
工作模式切换:(1)发生异常,处理器自动改变CPSR中M[4:0]的值,进入相应的工作模式;(2)处理器处于特权模式时,用指令向CPSR的M[4:0]字段写入特定的值,进入相应的工作模式。
用户模式时,不能改变工作模式,除非发生异常。
ARM处理器7种工作模式特权模式异常模式用户和系统模式处理器的工作状态从编程的角度讲,ARM处理器工作在两种状态:ARM状态或Thumb状态。
(1)ARM状态:处理器执行32位的ARM指令集时,工作在这种状态。
(2)Thumb状态:处理器执行16位的thumb指令集时,工作在这种状态。
状态切换:通过跳转指令实现。
ARM的寄存器组织37个寄存器:31个通用寄存器,包括程序计数器PC;6个状态寄存器。
寄存器均为32位,分成7组,各工作模式拥有自己的寄存器组,只能访问自己的寄存器组。
有些寄存器是重叠的,有些是工作模式特有的。
在不同的工作模式和处理器状态下,程序员可以访问的寄存器不尽相同。
ARM状态各模式下的寄存器ARM寄存器分类ARM状态各模式下可以访问的寄存器R0~R7通用寄存器R8~R12的两个分组R13、R14的6个分组堆栈指针寄存器R13(SP)链接寄存器R14(LR)R14(LR)的作用作用:保存返回地址例如:1.程序A执行过程中调用程序B;2.程序跳转至标号Lable,执行程序B。
arm架构 指令集

arm架构指令集ARM架构是目前最主流的嵌入式系统架构之一,它具有低功耗、低成本、高性能等优势,深受广大开发者的喜爱。
其中,指令集是ARM 架构的重要组成部分,对开发者而言,掌握各种指令集非常有必要。
接下来,我们将分步骤阐述ARM架构指令集相关的内容。
一、ARM架构概述ARM架构是一种精简指令集架构(RISC),它最初是由英国的ARM 公司于上世纪80年代初提出的,以应对当时高端嵌入式设备市场的需求。
其设计目标是提高能效和计算速度,并实现高度集成化,同时保持指令集设计的简洁性,方便硬件设计者进行系统优化。
二、ARM架构的指令集1. ARM指令集ARM指令集是最早的ARM体系结构,它由32位指令组成,主要应用于嵌入式系统和移动设备领域,是ARM架构中最主流的指令集。
ARM指令集包含了大量的寄存器和指令,如R0-R15、CMP、ADD等。
2. Thumb指令集Thumb指令集是ARM公司在1994年推出的,它主要是针对内存容量较小、功耗控制要求高的环境下使用,它采用16位指令长度,相较于常用的32位长度指令,能降低指令所占用的存储空间,从而节省成本。
Thumb指令集包括了比较特殊的指令,如CBZ、LDRH等。
3. Thumb-2指令集Thumb-2指令集是基于Thumb指令集的扩展版本,既支持16位指令长度,也支持32位指令长度。
Thumb-2指令集是为了兼顾高效和代码密度而设计的。
它采用了一系列新的指令,如MOV、LSL等,并将Thumb 和ARM两种指令集实现了无缝切换,便于编译器进行代码优化。
4. ARMv7-M指令集ARMv7-M指令集是ARM公司最新的嵌入式系统指令集,它在ARM指令集的基础上做了很多优化,提供更加高效、安全、实用的指令集,重点支持通用数学、位操作、存储器、DMA控制等指令。
它可以运行在更加高效的Cortex-M内核上,提供更加强大的性能和更佳的功耗控制。
三、总结在开发嵌入式系统和移动设备时,深入掌握各种指令集是非常有必要的,不同的指令集具有各自的优势和适用场景,开发者应该根据需求进行选择。
常用arm指令集

常用arm指令集ARM指令集是一种广泛使用的指令集架构,被广泛应用于各种嵌入式系统、移动设备和服务器等领域。
它具有高效、灵活、可扩展等特点,是现代计算机体系结构的重要组成部分。
本文将介绍常用的ARM指令集。
一、ARM指令集概述ARM指令集是一种精简指令集(RISC)架构,它采用了精简的指令集来提高执行效率和降低功耗。
由于其精简化的设计,ARM处理器可以在更小的面积内实现更高的性能和更低的功耗。
目前,ARM处理器已经广泛应用于各种嵌入式系统、移动设备和服务器等领域。
二、常用ARM指令集1.数据处理指令数据处理指令是最基本和最常用的ARM指令之一。
它包括加法、减法、乘法、除法等运算操作。
这些操作不涉及内存访问,只对寄存器中的数据进行操作。
例如:ADD R1, R2, R3:将R2和R3中的值相加,并将结果存储到R1中。
SUB R1, R2, #10:将R2中的值减去10,并将结果存储到R1中。
MUL R1, R2, R3:将R2和R3中的值相乘,并将结果存储到R1中。
2.数据传输指令数据传输指令是用于在寄存器和内存之间传输数据的指令。
它包括从内存读取数据、向内存写入数据等操作。
例如:LDR R1, [R2]:从地址为R2的内存单元中读取一个字节的数据,并将其存储到寄存器R1中。
STR R1, [R2]:将寄存器R1中的值写入地址为R2的内存单元中。
3.分支指令分支指令用于实现程序跳转,包括无条件跳转、有条件跳转等操作。
它是实现程序控制流程的关键指令之一。
例如:B label:无条件跳转到标记为label的位置。
BEQ label:如果前一次比较结果为相等,则跳转到标记为label的位置。
4.逻辑运算指令逻辑运算指令用于实现与、或、非、异或等逻辑运算操作。
它通常用于实现位操作和掩码操作等功能。
例如:AND R1, R2, #0xFF:将寄存器R2和0xFF进行按位与操作,并将结果存储到寄存器R1中。
ORR R1, R2, #0xFF:将寄存器R2和0xFF进行按位或操作,并将结果存储到寄存器R1中。
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指令集类型摘要:一、arm 指令集简介1.arm 指令集的发展历程2.arm 指令集的优势和特点二、arm 指令集的类型1.armv1 和armv2 指令集2.armv3 指令集3.armv4 指令集4.armv5 指令集5.armv6 指令集6.armv7 指令集7.armv8 指令集三、arm 指令集的应用领域1.嵌入式系统2.移动设备3.服务器和数据中心4.物联网设备正文:arm 指令集类型随着科技的飞速发展,arm 指令集在现代处理器中扮演着举足轻重的角色。
arm 指令集以其高性能、低功耗和强大的兼容性在全球范围内得到了广泛的应用。
本文将对arm 指令集的类型进行详细的介绍。
一、arm 指令集简介arm 指令集起源于英国Acorn 计算机公司,后由ARM 公司进行进一步研发和推广。
它具有高性能、低功耗、指令集简单、开发成本低等优点。
arm 指令集在嵌入式系统、移动设备、服务器和数据中心等领域有着广泛的应用。
二、arm 指令集的类型arm 指令集从armv1 到armv8,共经历了八个版本的迭代。
1.armv1 和armv2 指令集:这是arm 指令集的早期版本,主要用于嵌入式系统。
2.armv3 指令集:在armv2 的基础上进行了改进,增加了浮点运算指令。
3.armv4 指令集:引入了Thumb-1 指令集,是一种基于arm 指令集的压缩指令集,可以减少程序的存储空间和运行时间。
4.armv5 指令集:对armv4 指令集进行了优化,提高了性能。
5.armv6 指令集:引入了Thumb-2 指令集,是对thumb-1 指令集的升级,增加了更多的指令,提高了性能。
6.armv7 指令集:在armv6 的基础上进行了改进,引入了VFPv3 和NEON 协处理器,增强了浮点运算和多媒体处理能力。
7.armv8 指令集:这是arm 指令集的最新版本,采用了全新的架构,包括AArch32 和AArch64 两种执行状态,支持64 位计算,显著提高了性能。
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的数据操作 协处理器的数据存取 协处理器的寄存器传送
5.arm和x86的常用指令用法

Arm和x86是两种常见的指令集架构,分别用于移动设备和个人电脑。
它们的指令集有很多共同之处,但也有一些差异。
本文将介绍Arm和x86的常用指令用法,以帮助读者更好地理解这两种架构的特点和优劣势。
一、Arm指令集架构(Arm ISA)Arm是一种RISC(Reduced Instruction Set Computer)架构,其指令集相对较小,执行效率较高。
Arm指令集包括以下几类指令:1. 数据传送指令:包括MOV(数据传送)、LDR(加载)、STR(存储)等指令,用于在寄存器和内存之间传递数据。
2. 算术运算指令:包括ADD(加法)、SUB(减法)、MUL(乘法)、DIV(除法)等指令,用于进行各种算术运算。
3. 逻辑运算指令:包括AND(与)、ORR(或)、EOR(异或)、NOT(取反)等指令,用于执行逻辑运算。
4. 分支跳转指令:包括B(无条件跳转)、BEQ(等于时跳转)、BNE(不等于时跳转)等指令,用于在程序中实现跳转功能。
5. 特权指令:包括MRS(读特权寄存器)、MSR(写特权寄存器)、SVC(软中断)等指令,用于管理处理器的特权模式和中断处理。
以上是Arm指令集中的一些常用指令,通过它们可以实现各种功能和操作。
二、x86指令集架构(x86 ISA)x86是一种CISC(Complex Instruction Set Computer)架构,其指令集较大且复杂,包括以下几类指令:1. 数据传送指令:包括MOV(数据传送)、LEA(加载有效位置区域)、XCHG(交换数据)等指令,用于在寄存器和内存之间传递数据。
2. 算术运算指令:包括ADD(加法)、SUB(减法)、IMUL(整数乘法)、IDIV(整数除法)等指令,用于进行各种算术运算。
3. 逻辑运算指令:包括AND(与)、OR(或)、XOR(异或)、NOT(取反)等指令,用于执行逻辑运算。
4. 分支跳转指令:包括JMP(无条件跳转)、JE(等于时跳转)、JNE(不等于时跳转)等指令,用于在程序中实现跳转功能。
arm架构指令集

arm架构指令集ARM架构是一种基于RISC(Reduced Instruction Set Computing)的计算机处理器架构,它被广泛应用于移动设备、嵌入式系统、网络设备等领域。
ARM指令集是ARM架构的核心部分,它定义了处理器如何执行指令以及如何访问内存和I/O设备。
一、ARM指令集概述1. ARM指令集分类ARM指令集可以分为三类:ARM指令集,Thumb指令集和Thumb-2指令集。
其中,ARM指令集是32位的,Thumb和Thumb-2是16位的。
2. ARM寄存器ARM架构有15个通用寄存器(R0-R14)和一个程序计数器(PC)。
通用寄存器可以用来存储数据或地址,程序计数器则用来存储下一条要执行的指令地址。
3. ARM指令格式ARM指令格式包括操作码、操作数和条件码。
操作码表示要执行的操作类型,操作数表示要进行操作的数据或地址,条件码表示在何种情况下执行该条指令。
4. ARM访问内存在ARM中,访问内存需要使用Load和Store指令。
Load用于将数据从内存中读取到寄存器中,Store用于将数据从寄存器中写入到内存中。
5. ARM流水线流水线是ARM处理器中的一种指令执行方式,它将指令执行过程分为若干个阶段,每个阶段可以同时执行不同的指令。
ARM流水线包括取指、译码、执行、访存和写回等阶段。
二、ARM指令集详解1. ARM指令集ARM指令集是32位的,它支持数据处理、分支跳转、访存和其他操作。
以下是一些常用的ARM指令:(1)MOV:将一个寄存器中的值移动到另一个寄存器中。
(2)ADD:将两个寄存器中的值相加,并将结果存储到另一个寄存器中。
(3)SUB:将两个寄存器中的值相减,并将结果存储到另一个寄存器中。
(4)MUL:将两个寄存器中的值相乘,并将结果存储到另一个寄存器中。
(5)CMP:比较两个寄存器中的值是否相等,并设置条件码。
2. Thumb指令集Thumb指令集是16位的,它可以减小程序大小和内存占用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1) 立即数。立即数可以是一个无符号数值,这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。指令举例 如下:
LDR R1,[R0,#0x12] ;将 R0+0x12 地址处的数据读出,保存到 R1 中(R0 的值不变) LDR R1,[R0,#-0x12];将 R0-0x12 地址处的数据读出,保存到 R1 中(R0 的值不变) LDR R1,[R0] ;将 R0 地址处的数据读出,保存到 R1 中(零偏移) (2)寄存器。寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。指令举例值。指令举例如下: LDR R1,[R0,R2] ;将 R0+R2 地址的数据计读出,保存到 R1 中(R0 的值不变) LDR R1,[R0,-R2] ;将 R0-R2 地址处的数据计读出,保存到 R1 中(R0 的值不变) (3)寄存器及移位常数。寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。指令举例如下: LDR R1,[R0,R2,LSL #2] ;将 R0+R2*4 地址处的数据读出,保存到 R1 中(R0,R2 的值不变) LDR R1,[R0,-R2,LSL #2];将 R0-R2*4 地址处的数据计读出,保存到 R1 中(R0,R2 的值不变) 从寻址方式的地址计算方法分,加载/存储指令有以下 4 种形式: (1)零偏移。Rn 的值作为传送数据的地址,即地址偏移量为 0。指令举例如下: LDR Rd,[Rn] (2)前索引偏移。在数据传送之前,将偏移量加到 Rn 中,其结果作为传送数据的存储地址。若使用后缀“!”,则结果写回到 Rn 中,且 Rn 值不允许为 R15。指令举例如下: LDR Rd,[Rn,#0x04]! LDR Rd,[Rn,#-0x04] (3)程序相对偏移。程序相对偏移是索引形式的另一个版本。汇编器由 PC 寄存器计算偏移量,并将 PC 寄存器作为 Rn 生成前索 引指令。不能使用后缀“!”。指令举例如下: LDR Rd,label ;label 为程序标号,label 必须是在当前指令的±4KB 范围内 (4) 后索引偏移。Rn 的值用做传送数据的存储地址。在数据传送后,将偏移量与 Rn 相加,结果写回到 Rn 中。Rn 不允许是 R15。 指令举例如下: LDR Rd,[Rn],#0x04 地址对准--大多数情况下,必须保证用于 32 位传送的地址是 32 位对准的。 加载/存储字和无符号字节指令举例如下: LDR R2,[R5] ;加载 R5 指定地址上的数据(字),放入 R2 中 STR R1,[R0,#0x04] ;将 R1 的数据存储到 R0+0x04 存储单元,R0 值不变 LDRB R3,[R2],#1 ;读取 R2 地址上的一字节数据,并保存到 R3 中,R2=R3+1 STRB R6,[R7] ;读 R6 的数据保存到 R7 指定的地址中,只存储一字节数据 加载/存储半字和带符号字节。这类 LDR/STR 指令可能加载带符字节\加载带符号半字、加载/存储无符号半字。偏移量格式、寻 址方式与加载/存储字和无符号字节指令相同。指令格式如下: LDR{cond}SB Rd,<地址> ;加载指定地址上的数据(带符号字节),放入 Rd 中 LDR{cond}SH Rd,<地址> ;加载指定地址上的数据(带符号字节),放入 Rd 中 LDR{cond}H Rd,<地址> ;加载半字数据,放入 Rd 中,即 Rd 最低 16 位有效,高 16 位清零 STR{cond}H Rd,<地址> ;存储半字数据,要存储的数据在 Rd,最低 16 位有效 说明:带符号位半字/字节加载是指带符号位加载扩展到 32 位;无符号位半字加载是指零扩展到 32 位。 地址对准--对半字传送的地址必须为偶数。非半字对准的半字加载将使 Rd 内容不可靠,非半字对准的半字存储将使指定地址的 2 字节存储内容不可靠。 加载/存储半字和带符号字节指令举例如下: LDRSB R1[R0,R3] ;将 R0+R3 地址上的字节数据读出到 R1,高 24 位用符号位扩展 LDRSH R1,[R9] ;将 R9 地址上的半字数据读出到 R1,高 16 位用符号位扩展 LDRH R6,[R2],#2 ;将 R2 地址上的半字数据读出到 R6,高 16 位用零扩展,R2=R2+1 SHRH R1,[R0,#2]!;将 R1 的数据保存到 R2+2 地址中,只存储低 2 字节数据,R0=R0+2
CMP R0,R1
; R0 与 R1 比较
ADDHI R0,R0,#1
; 若 R0>R1,则 R0=R0+1
ADDLS R1,R1,#1
;若 R0<=R1,则 R1=R1+1
若两个条件均成立,则将这两个数值相加,C 代码为:
If((a!=10)&&(b!=20)) a=a+b;
对应的 ARM 指令如下,其中 R0 为 a,R1 为 b。
表 A-2 ARM 存储访问指令表
LDR 和 STR 加载/存储字和无符号字节指令。使用单一数据传送指令(STR 和 LDR)来装载和存储单一字节或字的数据从/到内存。LDR 指令用 于从内存中读取数据放入寄存器中;STR 指令用于将寄存器中的数据保存到内存。指令格式如下: LDR{cond}{T} Rd,<地址>;加载指定地址上的数据(字),放入 Rd 中 STR{cond}{T} Rd,<地址>;存储数据(字)到指定地址的存储单元,要存储的数据在 Rd 中 LDR{cond}B{T} Rd,<地址>;加载字节数据,放入 Rd 中,即 Rd 最低字节有效,高 24 位清零 STR{cond}B{T} Rd,<地址>;存储字节数据,要存储的数据在 Rd,最低字节有效 其中,T 为可选后缀,若指令有 T,那么即使处理器是在特权模式下,存储系统也将访问看成是处理器是在用户模式下。T 在用 户模式下无效,不能与前索引偏移一起使用 T。 LDR/STR 指令寻址是非常灵活的,由两部分组成,一部分为一个基址寄存器,可以为任一个通用寄存器,另一部分为一个地址 偏移量。地址偏移量有以下 3 种格式:
ARM 指令集详解
发布: 2010-3-19 11:42 | 作者: Saiu | 来源: MCU 嵌入式领域
ARM 可以用两套指令集:ARM 指令集和 Thumb 指令集。本文介绍 ARM 指令集。在介绍 ARM 指令集之前,先介绍指令的格式。
1 指令格式 (1)基本格式 <opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>} 其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,而{<cond>}为指令执行条件,是可选的,
CMP R0,#10
; 比较 R0 是否为 10
CMPNE R1,#20
; 若 R0 不为 10,则比较 R1 是否 20
ADDNE R0,R0,R1
; 若 R0 不为 10 且 R1 不为 20,指令执行,R0=R0+R1
2 ARM 存储器访问指令
ARM 处理是加载/存储体系结构的典型的 RISC 处理器,对存储器的访问只能使用加载和存储指令实现。ARM 的加载/存储指令是
LSR #n 逻辑左移 n 位(1≤n≤32) ROR #n 循环右移 n 位(1≤n≤31) RRX 带扩展的循环右移 1 位 type Rs 其中,type 为 ASR,LSL,和 ROR 中的一种;Rs 偏移量寄存器,低 8 位有效,若其值大于或等于 32,则第 2 个操作 数的结果为 0(ASR、ROR 例外)。 寄存器偏移方式应用举例: ADD R1,R1,R1,LSL #3 ;R1=R1*9 SUB R1,R1,R2,LSR#2 ;R1=R1-R2*4 R15 为处理器的程序计数器 PC,一般不要对其进行操作,而且有些指令是不允许使用 R15,如 UMULL 指令。 (3)条件码 使用指令条件码,可实现高效的逻辑操作,提高代码效率。表 A-1 给出条件码表。