目录

一.概念:

二.指令集种类

1.算术运算指令

1.1.ADD指令

1.2.ADC指令

1.3.SUB指令

1.4.SBC指令

2.逻辑运算指令

2.1.AND指令

2.2.EOR

3.MOV指令

4.分支指令

5.数据传送指令

5.1.单一数据传送指令

5.2.多数据传送指令

三、ARM指令集有哪些版本和架构?

四、ARM指令集如何执行?

五、ARM指令集与其他指令集有何不同?

六、如何编写适用于ARM架构的代码?

1、了解ARM架构的特点和指令集

2、使用适当的编译器和工具链

3、考虑内存和性能

4、优化代码

七、ARM指令集的性能如何?

八、ARM指令集用于哪些领域和应用程序?

九、ARM指令集是否支持浮点运算和向量计算?

十、ARM指令集的开发和维护由谁负责?


一.概念:

      指令集指一个微处理器所有指令的集合。处理器的指令集可以分为CISC(复杂指令集)和RISC(精简指令集),ARM处理器使用RISC。

     ARM处理器支持ARMThumb两种指令集:ARM指令集工作在32位模式下,指令长度都是32b;Thumb指令集工作在16位模式下,指令长度都是16b。

二.指令集种类

1.算术运算指令

1.1.ADD指令

ADD指令用与普通的加法运算。

格式:ADD{条件} {S} <dest>, <op_1>, <op_2>

//dest是目的寄存器,op_1和op_2是操作数dest=op_1+op_2

ADD指令把两个操作数op_1和op_2相加的结果存放到目的寄存器dest中,操作数op_1和op_2可以是寄存器或者是一个立即数。

例:

ADD     R0, R1,R2           ;  R0=R1+R2

ADD     R0, R1,#256         ;  R0=R1+256

ADD     R0, R1,R3,LSL#1   ;  R0=R1+(R3<<1)

1.2.ADC指令

ADC指令用于带进位的加法运算

格式:ADC{条件} {S} <dest>, <op_1>, <op_2>

//dest是目的寄存器,op_1和op_2是操作数dest = op_1 + op_2 + carry

ADC指令把两个操作数op_1和op_2相加的结果存放到目的寄存器dest中。ADC指令使用一个进位标志位,可以进行大于32位的加法操作。

例:

;64位数结果:存放在寄存器R0和R1

;两个32位数:存放在寄存器R2和R3

ADCS    R0,R2,R3   ;带进位加,结果保存在R0和R1寄存器

1.3.SUB指令

格式:SUB{条件} {S} <dest>, <op_1>, <op_2>

//dest是目的寄存器,op_1和op_2是操作数dest=op_1-op_2

SUB指令把两个操作数op_1和op_2相减的结果存放到目的寄存器dest中,操作数op_1和op_2可以是寄存器或者是一个立即数。

例:

SUB     R0, R1,R2           ;  R0=R1-R2

SUB     R0, R1,#256         ;  R0=R1-256

SUB     R0, R1,R3,LSL#1   ;  R0=R1-(R3<<1)

1.4.SBC指令

格式:SBC{条件} {S} <dest>, <op_1>, <op_2>

//dest是目的寄存器,op_1和op_2是操作数dest = op_1 - op_2 -! Carry

SBC指令把两个操作数op_1和op_2相减的结果存放到目的寄存器dest中.SBC指令支持借位标志,故可以支持大于32位的减法操作。

2.逻辑运算指令

2.1.AND指令

AND指令求连个操作数的逻辑与的结果

格式:AND{条件} {S} <dest>, <op_1>, <op_2>

//dest是目的寄存器,op_1和op_2是操作数dest=op_1 AND op_2

AND指令在两个操作数op_1和op_2做逻辑与操作,结果存放到目的寄存器dest中,AND指令常用于屏蔽寄存器中的某一位。op_1是寄存器,op_2可以是寄存器或者是一个立即数。

例:

AND    R0, R0,#3      ;R0的第0位和第1位保持不变,其他位清零

2.2.EOR

EOR指令对两个操作数做异或运算。

格式:EOR{条件} {S} <dest>, <op_1>, <op_2>

//dest是目的寄存器,op_1和op_2是操作数dest=op_1 EOR op_2

EOR指令在两个操作数op_1和op_2做逻辑异或操作,结果存放到目的寄存器dest中,常用于设置某个特定反转。EOR指令中,op_1是寄存器,op_2可以是寄存器或者是一个立即数。

例:

EOR    R0, R0,#3      ;R0的第0位和第1位被反转

3.MOV指令

MOV指令在两个操作数之间复制数据。

格式:MOV{条件} {S} <dest>, <op_1>

//dest是目的寄存器,op_1是操作数dest=op_1

MOV指令的作用是把另一个寄存器中,支持操作数的移位操作。

例:

MOV   R0,R0            ;R0 = R0相当于没有操作

MOV   R0,R0,LST#3    ;R0 = R0 * 8 LST寄存器左移3位,相当于乘8

4.分支指令

B指令可以根据设置的条件跳转到指定的代码地址。

格式; B{条件} <地址>

B指令是分支跳转指令。程序中遇到B指令会立即跳转到指定地址,然后继续从新的地址开始运行程序。

5.数据传送指令

数据传送指令用于CPU和存储器之间的数据传送,是ARM处理器唯一能与外部存储器交换数据的一类指令。

5.1.单一数据传送指令

单一数据传送指令用于内向存储。

格式:

LDR{条件}       Rd;<地址>

STR{条件}       Rd;<地址>

LDR{条件}B     Rd;<地址>

STR{条件}B     Rd;<地址>

单一数据传送指令STR和LDR可以在内存和寄存器之间装载或者存储一个或多个字节的数据,并提供了;灵活的寻址方式。Rd是要操作的数值,地址可以是基址寄存器Rbase和变址寄存器Rindex指定的地址。在条件后加入标志B代表一次传送1字节数据。

常见寻址方式:

STR   Rd,  [Rbase]             ;存储Rd到Rbase所包含的有效地址

STR   Rd,  [Rbase,Rindex]    ;存储Rd到Rbase+Rindex所合成的有效地址

STR   Rd,  [Rbase,#index]    ;存储Rd到Rbase+index所合成的有效地址,index是立即数

 

5.2.多数据传送指令

多数据传送指令用于向内存装载和存储多个字节或字的数据。

格式; xxM{条件} {类型}  Rn{!}, <寄存器列表>{^}

其中,xx可以是LD(装载),也可以是ST(存储).多数据传送指令用于寄存器和内存之间多个数据的复制。

指令包括:

LDMED    LDMIB   ;装载前增加地址,相当于C语言的++p

LDMFD    LDMIA   ;装载前增加地址,相当于C语言的p++

LDMEA    LDMDB   ;装载前增加地址,相当于C语言的++*p

LDMFA    LDMDA   ;装载前增加地址,相当于C语言的*p++

STMFA    STMIB     ;存储前增加地址

STMEA    STMIA     ;存储后增加地址

STMFD    STMDB    ;存储前增加值

STMED    STMDA    ;存储后增加值

 

附:

ARM处理器支持的移位操作:

LSL 逻辑左移          寄存器的二进制位从右往左移动,空出的位补0

LSR 逻辑右移          寄存器的二进制位从左往右移动,空出的位补0

ASR 算术右移          移位过程中符号位不变,即如果源操作数是正数,则字的高端空出的位补0否则补1                          


ROR 循环右移          寄存器的低端移出的位填入字的高端空出的位

RRX 带扩展的循环位移    操作数右移一位,高端空出的位用原C标志值填充

三、ARM指令集有哪些版本和架构?

ARM指令集有多个版本和架构,其中最常见的包括以下几种:

  1. ARMv6:这是最早的ARM指令集版本,用于早期的ARM处理器和嵌入式系统。
  2. ARMv7:这是目前使用最广泛的ARM指令集版本,被用于大量的智能手机和平板电脑等移动设备上。ARMv7指令集包括多个不同的架构,包括A、R和M。
  3. ARMv8:这是最新的ARM指令集版本,引入了64位架构,提高了处理器性能和能效。ARMv8指令集还包括多个架构,包括A、R和M。

除了上述常见的ARM指令集版本和架构之外,ARM还针对不同的应用领域推出了一些特定的指令集版本,例如ARMv7-M用于嵌入式系统和微控制器,ARMv7-A用于应用领域等。

四、ARM指令集如何执行?

ARM指令集的执行过程可以简单地描述为以下三个步骤:

  1. 取指阶段(Instruction Fetch):CPU从内存中读取下一条要执行的指令,并将其存储在指令寄存器中。
  2. 执行阶段(Instruction Execute):根据指令的类型和操作数,CPU执行该指令。例如,如果指令是ADD R1, R2, R3,CPU会将寄存器R2和R3的值相加,并将结果存储在R1中。
  3. 存储阶段(Memory Access/Writing):在一些指令需要访问内存时,CPU会根据指令中的地址,将数据从内存中读取或写入内存中。这些指令通常包括加载(load)和存储(store)指令。

以上三个步骤将循环执行,直到程序结束。ARM指令集的执行过程高度优化和流水线处理,可以实现高效的程序执行速度和性能。

五、ARM指令集与其他指令集有何不同?

ARM指令集与其他指令集(如x86)有以下几个不同点:

  1. RISC架构:ARM指令集属于RISC(Reduced Instruction Set Computing)架构,相比x86等CISC(Complex Instruction Set Computing)架构,指令数量更少,指令长度也更短,执行效率更高。
  2. 使用寄存器:ARM指令集使用寄存器来传递参数和保存变量,而x86等指令集则使用堆栈。
  3. 条件执行:ARM指令集支持条件执行,可以根据条件决定是否执行某个指令,这可以使代码更加紧凑高效。
  4. 编译器优化:由于ARM指令集的简单性和规范性,编译器可以更好地优化代码,提高执行效率。
  5. 不同版本:ARM指令集有多个版本,适用于不同的场景和设备,如ARMv6适用于低功耗嵌入式设备,而ARMv8适用于服务器和高性能计算机等场景。

六、如何编写适用于ARM架构的代码?

编写适用于ARM架构的代码需要考虑以下几个方面:

1、了解ARM架构的特点和指令集

ARM架构采用精简指令集(RISC)的设计理念,其指令集主要包括数据处理指令、加载/存储指令、分支/跳转指令等。开发者需要了解ARM架构的特点和指令集,以便编写出高效且优化的代码。

2、使用适当的编译器和工具链

针对ARM架构进行编程需要使用适当的编译器和工具链。其中,ARM的工具链包括编译器、调试器、链接器、库文件等,对于ARM架构的编程可以使用GCC/G++、LLVM/Clang等编译器工具链。

3、考虑内存和性能

ARM处理器在内存和性能方面与传统的桌面计算机不同,ARM处理器使用的内存技术和技巧也与桌面计算机有所不同。因此,编写适用于ARM架构的代码时需要考虑内存和性能的限制,以避免出现性能瓶颈和内存不足的问题。

4、优化代码

为了提高ARM架构上程序的性能,需要对代码进行优化。优化的方式包括利用寄存器、循环展开、代码重排、缓存优化、指令级并行等,这些方法都可以有效地提高程序的执行效率。

综上所述,编写适用于ARM架构的代码需要对ARM架构有深入的了解,使用适当的编译器和工具链,考虑内存和性能等问题,并对代码进行优化。

七、ARM指令集的性能如何?

ARM指令集的性能非常优秀。由于ARM指令集的设计目标是在低功耗、高性能和小尺寸之间取得平衡,因此它非常适合嵌入式系统和移动设备。ARM处理器通常拥有低功耗、高效率和优秀的节能性能,这使得它们非常适合用于智能手机、平板电脑、汽车控制系统和其他嵌入式设备。此外,ARM指令集具有高度的可靠性和可扩展性,使得它们非常适合处理器高并发的工作负载。最新的ARM处理器还包括许多高级特性,如虚拟化、硬件加速和多核支持,这些特性使得它们能够应对更广泛的应用场景。因此,ARM指令集的性能是非常强大和有竞争力的。

八、ARM指令集用于哪些领域和应用程序?

ARM指令集广泛应用于嵌入式系统和移动设备,包括智能手机、平板电脑、数字电视、网络路由器等领域。此外,由于其低功耗、高性能和可靠性,ARM指令集也被用于许多其他应用程序,例如军事、航空航天、汽车、医疗和工业控制等。它还被广泛用于微控制器和微处理器中,包括网络设备、传感器、嵌入式软件等各种应用。总之,ARM指令集已经成为现代数字设备中最受欢迎的处理器架构之一。

九、ARM指令集是否支持浮点运算和向量计算?

是的,ARM指令集支持浮点运算和向量计算。ARM指令集中有专门用于浮点运算和向量计算的指令集,如VFP(向量浮点处理器)指令集和NEON指令集。VFP指令集提供了对浮点数和高精度浮点数的支持,而NEON指令集则提供了对SIMD(单指令多数据)向量计算的支持,可用于加速图像、音频、视频等应用程序的处理。

十、ARM指令集的开发和维护由谁负责?


ARM指令集的开发和维护由ARM公司负责。ARM公司是一家总部位于英国的半导体设计与软件开发公司,该公司专门从事ARM架构处理器和相关技术的研发、设计和许可,并向全球各地的客户提供处理器核和软件开发工具。ARM处理器核已经广泛应用于移动设备、数字家庭、嵌入式系统、物联网等领域。