ARM知识扫盲-RISC架构-ARM寄存器-ARM指令集

简介:

ARM本身使用的是RISC精简指令集架构,除此之外还有开源的RISC指令集架构RISC-V,复杂指令集CISC(Complex Instruction Set Computer)等等

RISC(Reduced Instruction Set Computer,精简指令集计算机)是一种计算机体系结构,其设计理念是通过精简指令集和简化指令执行过程来提高计算机的性能和效率。

RISC架构的主要特点包括以下几个方面:

  1. 简单指令集:RISC架构采用了一组精简、简单和固定长度的指令集。这些指令通常具有固定的操作数和操作码格式,并且执行时间相对均匀。这样可以降低指令的复杂性,使得指令的解码和执行更加高效。
  2. 加载/存储架构:RISC架构通常采用加载/存储(Load/Store)架构,即只有特定的加载和存储指令可以直接访问内存,而其他算术和逻辑操作必须通过寄存器之间的数据传递完成。这样的设计简化了指令的执行过程,并提高了执行速度。
  3. 寄存器优化:RISC架构倾向于使用寄存器来存储和处理数据,减少了对内存的频繁访问。通常,RISC架构会提供较多的通用寄存器,以便进行高效的数据操作和计算。
  4. 流水线执行:RISC架构倾向于采用流水线执行的方式,将指令执行过程分为多个阶段,并同时执行不同的指令。这样可以提高指令的吞吐量和并行性,加快程序的执行速度。
  5. 硬连线控制:RISC架构通常使用硬连线控制,即指令的执行顺序和流程在设计时就被固定下来,不需要复杂的控制逻辑。这样可以减少指令执行过程中的分支和跳转操作,提高了执行效率。

ARM寄存器

ARM处理器总共有37个32位寄存器,其中31个通用寄存器,6个特殊寄存器。

通用寄存器

ARM处理器的架构定义了一组32位的通用寄存器,通常被称为R0到R15。这些寄存器用于存储数据和执行算术操作。

R0到R12被视为通用寄存器,用于存储临时数据和计算结果。

R13通常用作堆栈指针(SP)

R14通常用作链接寄存器(LR)

R15通常用作程序计数器(PC)

然而,除了这些通用寄存器之外,ARM体系结构还包含一些特殊寄存器,如状态寄存器、程序状态寄存器(CPSR或APSR)、当前程序状态寄存器(SPSR)等,用于控制处理器的状态、执行异常处理、处理器模式切换等。

此外,一些ARM处理器的变体还可以包含其他特殊寄存器,如浮点寄存器、向量寄存器等,取决于具体的ARM架构版本和处理器型号。

特殊寄存器

ARM架构中有一些特殊寄存器,这些寄存器具有特殊的功能和用途。以下是其中的六个常见的特殊寄存器:

  1. 程序计数器(Program Counter,PC):程序计数器是ARM处理器中的一个重要寄存器,它存储着当前正在执行的指令的地址。它会随着指令的执行而自动递增,指向下一条要执行的指令的地址。
  2. 链接寄存器(Link Register,LR):链接寄存器存储了一个返回地址,用于函数调用时保存调用指令的下一条指令地址。当函数执行完毕后,通过链接寄存器可以返回到调用函数的下一条指令继续执行。
  3. 堆栈指针(Stack Pointer,SP):堆栈指针寄存器用于指向当前堆栈的顶部。堆栈是用于存储临时数据、函数调用和局部变量的一种数据结构。堆栈指针在函数调用时用于保存当前的堆栈位置,并在函数返回时恢复堆栈位置。
  4. 程序状态寄存器(Program Status Register,PSR):程序状态寄存器存储了处理器的状态信息,如条件码、中断使能标志、处理器模式等。它包括当前程序状态寄存器(CPSR)和当前程序状态寄存器备份(SPSR),用于处理异常和处理器模式切换。
  5. 中断屏蔽寄存器(Interrupt Disable Register,IDR):中断屏蔽寄存器用于控制和管理中断的使能和屏蔽。通过配置中断屏蔽寄存器,可以选择性地允许或禁止特定的中断请求。
  6. 控制寄存器(Control Register):控制寄存器用于管理处理器的一些控制功能,如缓存控制、内存管理单元(MMU)配置、保护域设置等。它们提供了对处理器行为和内存管理的控制。

这些特殊寄存器在ARM处理器中扮演着重要的角色,用于控制和管理处理器的执行、状态和外设操作。具体的ARM处理器型号和架构版本可能会有所不同,因此可能会存在其他特殊寄存器或略有差异。

ARM指令集

ARMv7 Cortex-M架构是ARM架构中专门针对嵌入式系统的一种变体。它主要用于低功耗、实时性要求高的嵌入式应用,如传感器、微控制器等。ARMv7 Cortex-M架构定义了一套特定的指令集,称为Thumb-2指令集。

Thumb-2指令集是一种16位和32位混合指令集,旨在提供高代码密度和较好的性能。以下是一些常见的Thumb-2指令:

  1. 移动指令

    mov r0, sp
    mov r1, #0
    
    • MOV:将32位的值移到一个寄存器中
    • MVN:将32位的值取反后移到一个寄存器中

    sp寄存器的值移动到r0寄存器

    将0反转后得到0xffffffffff移动到r1

    sp寄存器即R13寄存器常用作栈指针

  2. 移位器

    移动指令除了可以操作立即数与寄存器中的值 以外还可以使用移位器移位后的值,共有5种移位操作:逻辑左移LSL,逻辑右移LSR,算数右移ASR,循环右移ROR,扩展的循环右移RRX

    示例:

    mov r1, r1 ,LSL #9
    

    r1=(r1<<9)

  3. 算数指令

    算数指令执行32位有符号和无符号数的加减法

    常见算数指令

    ADC Rd, Rn, N
    
    ADC 带进位的加法 Rd=Rn+N+Carry
    ADD 加法 Rd=Rn+N
    RSB 反向减法 Rd=N-Rn
    RSC 带借位的反向减法 Rd=N-Rn-!(carry flag)
    SBC 带借位的减法 Rd=Rn-N-!(carry)
    SUB 减法 Rd=Rn-N
  4. 使用移位器的算术指令

    ADD r0, r1, r1, LSL #2
    

    r0 = r1+(r1<<2)

  5. 逻辑运算指令

  • AND

  • ORR

  • EOR

  • BIC:逻辑清位操作

    示例代码:

    and r1, r0, #0x1f
    

    r1 = r0 &0x1f

  1. 比较指令

比较指令用于将寄存器和一个32位数做比较或者测试,指令根据结果更新cpsr的标志位。

CMP Rn, N
CMP 否定比较 根据Rn+N的结果设定标志位
CMP 比较 根据Rn-N的结果设定标志位
TEQ 测试两个32位数是否相等 根据Rn^N的结果设定标志位
TST 测试一个32位数的位 根据Rn&N的结果设定标志位

示例:

teq r1, 0x1a

比较r1是否等于0x1a,并设置标志位

  1. 乘法指令

语法格式:

MLA {<cond>} {S} Rd,Rm,Rs,Rn
MUL {<cond>} {S} Rd,Rm,Rs
常见乘法指令 名称 含义
MLA 乘法和累加 Rd=(Rm*Rs)+Rn
MUL 乘法 Rd=Rm*Rs
<instruction> {cond} {S} RdLo,RdHi,Rm,Rs
常见乘法指令 名称 含义
SMLAL 有符号的长乘法累加 [RdHi,RdLo]=[RdHi,RdLo]+(Rm*Rs)
SMULL 有符号的长乘法 [RdHi,RdLo]=(Rm*Rs)
UMLAL 无符号的长乘法累加 [RdHi,RdLo]=[RdHi,RdLo]+(Rm*Rs)
UMULL 无符号的长乘法 [RdHi,RdLo]=(Rm*Rs)
  1. 分支指令

分支指令改变程序执行流程或者用于调用子程序。该类指令可以使得程序有子程序、if结构和循环。执行流程的改变强制程序计数器PC指向一个新地址

常用分支指令如下:

B label 跳转 pc=label
BL label 带返回的跳转 pc=label,lr=执行BL后下一条指令的地址
BX Rm 跳转并切换状态 pc=Rm&0xfffffffe,T=Rm&1
BLX label Rm 带返回的分支并切换状态 pc=label,T=1 PC=Rm&0xfffffffe,T=Rm&1 lr为执行BLX后下一条指令的地址

pc是程序计数器R15,lr是链接寄存器R14

  1. 软中断指令

软中断会引起软件中断这个异常,为操作系统提供了中断这个选项

SWI SWI_number 软中断 lr_svc=SWI指令之后下一条指令的地址,Spsr_svc=cpsr,PC=vectors+0x8,cpsr mode=SVC,cpsr I=1(屏蔽IRQ中断)
  1. 程序状态寄存器指令

    使用MSR与MRS控制程序状态寄存器psr

    MRS 将cpsr或spsr内容传到寄存器
    MSR 将寄存器内容传到cpsr或spsr
  2. 协处理器指令

    什么是协处理器

    • 协处理器(Coprocessor)是与主处理器(CPU)协同工作的特殊硬件组件,用于执行特定类型的计算或处理任务。协处理器是一个独立的处理单元,具有自己的指令集和寄存器集合,并与主处理器共享系统总线和内存。

    • 协处理器的设计目的是通过分担主处理器的工作负载,提供对特定任务的硬件加速和优化。它可以处理那些对于主处理器来说相对复杂或耗时的操作,如浮点运算、图形处理、加密解密等。

    • 在传统的计算机架构中,协处理器通常是可选的附加组件。主处理器执行一般的指令和控制流程,而协处理器则专注于特定的计算或处理任务。主处理器和协处理器之间通过特定的指令集和协处理器接口进行通信。

    • 例如,现代的中央处理器(CPU)通常具有浮点运算单元(FPU)作为协处理器,用于高精度的浮点运算。图形处理器(GPU)也可以被视为协处理器,专门用于图形渲染和并行计算。其他类型的协处理器包括加密协处理器、信号处理器(DSP)、向量处理器等,它们针对不同的应用领域提供特定的硬件加速。

    • 通过使用协处理器,系统可以实现更高的性能和效率。主处理器可以将复杂的任务委托给协处理器,并在需要时从中获取结果。这样可以提高系统的整体吞吐量,并加速特定类型任务的执行速度。

    • 需要注意的是,随着计算机体系结构的发展,某些协处理器的功能已经集成到主处理器中,以提供更全面的处理能力。例如,现代的CPU通常集成了浮点运算单元(FPU)和其他加速硬件,从而减少了对独立协处理器的需求。

    协处理器指令

    协处理器指令用于与协处理器进行通信和操作。ARMv7定义了协处理器指令集架构(CP15),用于管理处理器的系统控制寄存器。以下是一些常见的CP15指令及其功能:

    1. MCR (Move to Coprocessor from ARM Register) 和 MRC (Move to ARM Register from Coprocessor):这些指令用于在ARM寄存器和协处理器寄存器之间进行数据传输。通过指定协处理器编号和寄存器编号,可以实现数据的读取和写入。
    2. MCRR (Move to Coprocessor from Two ARM Registers) 和 MRRC (Move to Two ARM Registers from Coprocessor):这些指令用于在ARM寄存器和协处理器寄存器之间传输双字(64位)数据。它们在需要传输64位数据时比单个寄存器的MCR/MRC指令更高效。
    3. LDC (Load Coprocessor Register from Memory) 和 STC (Store Coprocessor Register to Memory):这些指令用于将协处理器寄存器的内容与内存之间进行数据传输。可以使用偏移量和基址寄存器来指定内存地址。
    4. CDP (Coprocessor Data Processing):这个指令用于执行与协处理器相关的操作。它可以指定协处理器编号、操作码和操作数,用于执行特定的协处理器操作。

    需要注意的是,具体的协处理器指令集和功能取决于所使用的协处理器的类型和实现。在ARMv7架构中,CP15用于系统控制和系统管理相关的功能。而针对其他类型的协处理器,如浮点运算单元(FPU),可能会有单独的指令集和指令。

  3. 加载常量的伪指令

LDR 加载常量的伪指令 Rd=32位常量
ADR 加载地址的伪指令 Rd=32位相对地址

猜你喜欢

转载自blog.csdn.net/weixin_51954217/article/details/130514702