ARM指令集
- 格式:doc
- 大小:37.50 KB
- 文档页数:16
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 指令集简介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 Holdings开发,并广泛应用于各种嵌入式系统、移动设备和低功耗应用中。
以下是ARM指令集的发展史:1. ARM1:ARM指令集最早出现在1985年的ARM1处理器上。
ARM1是一款32位处理器,采用精简指令集(RISC)设计理念,具有较低的能耗和成本。
2. ARM2:ARM2处理器于1987年发布,增加了对乘法指令的支持,并引入了缓存技术来提高性能。
3. ARMv3:ARMv3指令集体系结构于1992年推出,支持更多的指令和功能,如虚拟内存管理单元(VMMU)和协处理器。
4. ARMv4:ARMv4指令集体系结构于1995年发布,引入了Thumb指令集,可以以压缩的形式执行16位指令,提高了代码密度和节能效果。
5. ARMv5:ARMv5指令集体系结构于1997年推出,引入了Jazelle技术,使处理器能够直接执行Java字节码。
6. ARMv6:ARMv6指令集体系结构于2002年发布,引入了Thumb-2技术,将16位Thumb指令和32位ARM指令混合使用,提高了代码密度和性能。
7. ARMv7:ARMv7指令集体系结构于2004年发布,引入了NEON SIMD(单指令多数据)扩展指令集,提供更高的并行计算能力。
8. ARMv8:ARMv8指令集体系结构于2011年推出,是一个重要的里程碑,引入了64位处理器架构(AArch64),并保持了与之前32位指令集的向后兼容性。
9. ARMv9:目前(2024年)尚未发布,但ARM Holdings已经透露正在研发ARMv9指令集体系结构。
ARMv9预计将进一步提升性能、安全性和AI加速能力。
上述是ARM指令集的主要发展历程,每个版本都带来了新的功能和改进,使ARM成为全球最受欢迎的处理器架构之一,并广泛应用于各个领域。
ARM指令集详解ARM可以用两套指令集:ARM指令集和Thumb指令集。
本文介绍ARM指令集。
在介绍ARM指令集之前,先介绍指令的格式。
1 指令格式(1)基本格式<opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>}其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。
opcode 指令助记符,如LDR,STR 等cond 执行条件,如EQ,NE 等S 是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响Rd 目标寄存器Rn 第一个操作数的寄存器operand2 第二个操作数指令格式举例如下:LDR R0,[R1] ;读取R1 地址上的存储器单元内容,执行条件ALBEQ DATAEVEN ;跳转指令,执行条件EQ,即相等跳转到DATAEVENADDS R1,R1,#1 ;加法指令,R1+1=R1 影响CPSR 寄存器,带有SSUBNES R1,R1,#0xD;条件执行减法运算(NE),R1-0xD=>R1,影响CPSR 寄存器,带有S(2)第2个操作数在ARM 指令中,灵活的使用第2个操作数能提高代码效率,第2个操作数的形式如下:#immed_8r常数表达式,该常数必须对应8 位位图,即常数是由一个8 位的常数循环移位偶数位得到。
合法常量0x3FC、0、0xF0000000、200、0xF0000001等都是合法常量。
非法常量0x1FE、511、0xFFFF、0x1010、0xF0000010等都是非法常量。
常数表达式应用举例如下:MOV R0,#1 ;R0=1AND R1,R2,#0x0F ;R2 与0x0F,结果保存在R1LDR R0,[R1],#-4 ;读取R1 地址上的存储器单元内容,且R1=R1-4Rm寄存器方式,在寄存器方式下操作数即为寄存器的数值。
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 指令集⼀、ARM指令的格式和分类经典ARM 指令格式如下:<> 为必选项,{}为可选项为操作码,如ADD 表⽰算术加操作指令{} 决定指令执⾏条件域{S} 决定指令执⾏是否影响CPSR 寄存器的值为⽬的寄存器的第⼀个操作数为寄存器为第⼆个操作数⼆、ARM 指令条件执⾏及标志位ARM 指令可以通过添加适当的条件码后缀来达到条件执⾏的⽬的这样可以提⾼代码密度,减少分⽀跳转指令数⽬,提⾼性能。
默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位CMP 不需要增加 “S”就可改变相应的标志位。
使⽤条件码可以实现⾼效的逻辑操作,节省跳转和条件语句,提⾼代码效率如果指令不标明条件码,将默认为⽆条件(AL )执⾏。
<opcode> {<cond>} {S} <Rd>,<Rn>,<operand2>条件码表三、跳转指令 跳转指令⽤于实现程序流程的跳转,在ARM程序中有两种⽅法可以实现程序的跳转,⼀种是使⽤跳转指令直接跳转,另⼀种是直接向PC寄存器赋值实现跳转。
B{条件} ⽬标地址 B指令最简单的跳转指令,⼀旦遇到⼀个B指令,ARM处理器⽴即跳转⾄给定的⽬标地址,由此处继续执⾏。
跳转指令B限制在当前指令的⼟32MB范围内BL{条件} ⽬标地址 BL是⼀另个跳转指令,在跳转前会将下⼀条指令的地址复制到R14中,然后跳转到指定的地址运⾏程序。
可以通过将R14的内容重新加载到PC中,并返回到跳转指令之后的那个指令处执⾏。
BL是实现⼦程序调⽤的⼀个基本但常⽤的⼿段。
BLX{条件} ⽬标地址 BLX指令从ARM指令集跳转到指令中所指定的⽬标地址,并将处理器的⼯作状态由ARM状态切换到Thumb状态,该指令同时将PC的当前内容到寄存器R14中。
当程序使⽤Thumb指令集,⽽调⽤者使⽤ARM指令集时,可以通过BLX 指令实现程序的调⽤和处理器⼯作状态的切换。
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位的,它可以减小程序大小和内存占用。
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为进位标志值。
该指令用于实现超过32位的数的加法。
例如:第一个64位操作数存放在寄存器R2,R3中;第二个64位操作数存放在寄存器R4,R5中;64位结果存放在R0,R1中。
64位的加法可由以下语句实现:ADDS R0,R2,R4 ;低32位相加,S表示结果影响条件标志位的值ADC R1,R3,R5 ;高32位相加数据处理指令55.SUB 减法指令格式:SUB{<cond>}{S} <Rd>,<Rn>,<op2>;功能:Rd=Rn-op2op2可以是寄存器、被移位的寄存器或立即数。
例如:SUB R0,R1,#5 ;R0=R1-5SUB R0,R1,R2 ;R0=R1-R2SUB R0,R1,R2,LSL#5 ;R0=R1-R2左移5位数据处理指令66.RSB 反向减法指令格式:RSB{<cond>}{S} <Rd>,<Rn>,<op2>;功能:同SUB指令,但倒换了两操作数的前后位置,即Rd=op2-Rn。
例如:RSB R0,R1,#5 ;R0=5-R1RSB R0,R1,R2 ;R0=R2-R1RSB R0,R1,R2,LSL#5 ;R0=R2左移5位-R1数据处理指令77.SBC 带借位减法指令格式:SBC{<cond>}{S} <Rd>,<Rn>,<op2>;功能:Rd=Rn-op2-!carryop2可以是寄存器、被移位的寄存器或立即数。
SUB和SBC生成进位标志的方式不同于常规,如果需要借位则清除进位标志,所以指令要对进位标志进行一个非操作。
例如:第一个64位操作数存放在寄存器R2,R3中;第二个64位操作数存放在寄存器R4,R5中;64位结果存放在R0,R1中。
64位的减法(第一个操作数减去第二个操作数)可由以下语句实现:SUBS R0,R2,R4; 低32位相减,S表示结果影响条件标志位的值SBC R1,R3,R5; 高32位相减数据处理指令88.RSC 带借位的反向减法指令格式:RSC{<cond>}{S} <Rd>,<Rn>,<op2>;功能:同SBC指令,但倒换了两操作数的前后位置,即Rd=op2-Rn-!carry。
例如:前提条件与SBC例子相同,操作数1-操作数2的实现语句需改为:SUBS R0,R2,R4; 低32位相减,S表示结果影响寄存器CPSR的值RSC R1,R5,R3; 高32位相减数据处理指令——乘法指令ARM7TDMI具有三种乘法指令,分别为:32×32位乘法指令;32× 32位乘加指令;32× 32位结果为64位的乘/乘加指令。
数据处理指令99.MUL 32位乘法指令格式:MUL{<cond>}{S} <Rd>,<Rn>,<op2>;功能:Rd=Rn×op2该指令根据S标志,决定操作是否影响CPSR的值;其中op2必须为寄存器。
Rn和op2的值为32位的有符号数或无符号数。
例如:MULS R0,R1,R2 ;R0=R1×R2,结果影响寄存器CPSR的值数据处理指令1010.MLA 32位乘加指令格式:MLA{<cond>}{S} <Rd>,<Rn>,<op2>,<op3>;功能:Rd=Rn×op2+op3op2和op3必须为寄存器。
Rn、op2和op3的值为32位的有符号数或无符号数。
例如:MLA R0,R1,R2,R3 ;R0=R1×R2+R3数据处理指令1111.SMULL 64位有符号数乘法指令格式:SMULL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;功能:Rdh Rdl=Rn×op2Rdh、Rdl和op2均为寄存器。
Rn和op2的值为32位的有符号数。
SMULL R0,R1,R2,R3;R0=R2×R3的低32位;R1=R2×R3的高32位数据处理指令1212.SMLAL 64位有符号数乘加指令格式:SMLAL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;功能:Rdh Rdl=Rn×op2+Rdh RdlRdh、Rdl和op2均为寄存器。
Rn和op2的值为32位的有符号数,Rdh Rdl的值为64位的加数。
例如:SMLAL R0,R1,R2,R3;R0=R2×R3的低32位+R0;R1=R2×R3的高32位+R1数据处理指令1313.UMULL 64位无符号数乘法指令格式:UMULL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;功能:同SMULL指令,但指令中Rn和op2的值为32位的无符号数。
例如:UMULL R0,R1,R2,R3;R0=R2×R3的低32位;R1=R2×R3的高32位其中R2,R3的值为无符号数数据处理指令1414.UMLAL 64位无符号数乘加指令格式:UMLAL {<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;功能:同SMLAL指令,但指令中Rn,op2的值为32位的无符号数,Rdh Rdl的值为64位无符号数。
例如:UMLAL R0,R1,R2,R3;R0=R2×R3的低32位+R0;R1=R2×R3的高32位+R1其中R2,R3的值为32位无符号数R1,R0的值为64位无符号数数据处理指令1515.AND 逻辑与指令格式:AND{<cond>}{S} <Rd>,<Rn>,<op2>;功能:Rd=Rn AND op2op2可以是寄存器,被移位的寄存器或立即数。
一般用于清除Rn的特定几位。
AND R0,R0,#5;保持R0的第0位和第2位,其余位清0数据处理指令1616.ORR 逻辑或指令格式:ORR{<cond>}{S} <Rd>,<Rn>,<op2>;功能:Rd=Rn OR op2op2可以是寄存器、被移位的寄存器或立即数。
一般用于设置Rn的特定几位。
例如:ORR R0,R0,#5;R0的第0位和第2位设置为1,其余位不变数据处理指令1717.EOR 逻辑异或指令格式:EOR{<cond>}{S} <Rd>,<Rn>,<op2>;功能:Rd=Rn EOR op2op2可以是寄存器、被移位的寄存器或立即数。
一般用于将Rn的特定几位取反。
例如:EOR R0,R0,#5;R0的第0位和第2位取反,其余位不变数据处理指令1818.BIC 位清除指令格式:BIC{<cond>}{S} <Rd>,<Rn>,<op2>;功能:Rd=Rn AND (!op2)用于清除寄存器Rn中的某些位,并把结果存放到目的寄存器Rd中.操作数op2是一个32位掩码(mask),如果在掩码中设置了某一位,则清除Rn中的这一位;未设置的掩码位指示Rn中此位保持不变。
其中,op2可以是寄存器、被移位的寄存器或立即数。
例如:BIC R0,R0,#5;R0中第0位和第2位清0,其余位不变数据处理指令1919.CMP 比较指令格式:CMP{<cond>} <Rn>,<op1>;功能:Rn-op1该指令进行一次减法运算,但不存储结果,根据结果更新CPSR中条件标志位的值。
该指令不需要显式地指定S后缀来更改状态标志。
其中,操作数op1为寄存器或立即数。
例如:CMP R0, #5; 计算R0-5,根据结果设置条件标志位ADDGT R0, R0, #5; 如果R0>5,则执行ADDGT指令数据处理指令2020.CMN 反值比较指令格式:CMN{<cond>} <Rn>,<op1>;功能:同CMP指令,但寄存器Rn的值是和op1取负的值进行比较。
例如:CMN R0,#5 ;把R0与-5进行比较数据处理指令2121.TST 位测试指令格式:TST{<cond>} <Rn>,<op1>;功能:Rn AND op1根据结果更新CPSR中条件标志位的值,但不存储结果。