ARM 体系结构与汇编语言

RISC 指令集相对于 CISC 指令集,具有以下特点:

  • Load/Store 架构,CPU 不能直接处理内存中的数据,需要先将内存中的数据加载到寄存器中才能操作,然后将处理结果存储到内存中。
  • 固定的指令长度、单周期指令。
  • 倾向于使用更多的寄存器来存储数据,而不是使用内存中的堆栈、效率更高。

ARM 指令集和原汁原味的 RISC 相比,具有如下差异:

  • ARM 有桶型移位寄存器,单周期内可以完成数据的各种移位操作。
  • 并不是所有的 ARM 指令都是单周期的。
  • ARM 具有 16 位的 Thumb 指令集,是 32 位 ARM 指令集的压缩形式,提高了代码密度。
  • 条件执行:通过指令组合,减少了分支数目,提高了代码密度。
  • 增加了 DSP、SIMD/NEON 等指令。

ARM 处理器具有多种工作模式

为了保证计算机能长期安全稳定地运行,CPU 提供了多种工作模式和权限管理。应用程序正常运行时,处理器处于普通模式,没有权限对内存和底层硬件进行操作。应用程序如果要读写磁盘上的音频数据,驱动声卡播放音乐,往屏幕写数据显示歌词,则要首先通过系统调用或软中断进入处理器特权模式,运行操作系统内核或硬件驱动代码,才能对底层的硬件设备进行读写。

处理器模式 模式介绍
User mode 应用程序正常运行时的工作模式
FIQ mode 快速中断模式,中断优先级比 IRQ 高
IRQ mode 中断模式
Supervisor mode 管理程序模式,保护模式,复位和软中断时一般都会进入该模式
Abort mode 数据存取异常、指令读取失败时会进入该模式
Undefined mode CPU遇到无法识别、未定义的指令时,会进入该模式
System mode 可运行特权 OS 任务,切换到其他模式
Monitor mode 仅限于安全扩展

ARM 处理器中的寄存器可分为通用寄存器和专用寄存器两种

寄存器 R0~R12 属于通用寄存器,除了 FIQ 工作模式,在其他工作模式下这些寄存器都是共用的、共享的:R0~R3 通常用来传递函数参数,R4~R11 用来保存程序运算的中间结果或函数的局部变量等,R12 常用来作为函数调用过程中的临时寄存器。

在每个工作模式下均有一组 R13、R14、R15、CPSP、SPSR 寄存器,R13 又称为堆栈指针寄存器(SP),用来维护和管理函数调用过程中的栈帧变化,总是指向当前正在运行的函数的栈帧,一般不能再用作其他用途,R14 寄存器又称为链接寄存器(LR),在函数调用过程中主要用来保存上一级函数调用者的返回地址,寄存器 R15 又称为程序计数器(PC),CPU 从内存取指令执行,每取一次指令,PC 寄存器的地址自动增加。CPU 一条一条不停地取指令,程序就源源不断地一直运行下去。当前处理器状态寄存器(CPSR)主要用来表征当前处理器的运行状态,除了各种状态位、标志位,CPSR 寄存器里也有一些控制位,用来切换处理器的工作模式和中断使能控制。当 ARM处理器切换工作模式或发生异常时,程序状态保存寄存器(SPSR)用来保存当前工作模式下的处理器现场,即将 CPSR 寄存器的值保存到当前工作模式下的 SPSR 寄存器。

FIQ 模式是一种特殊的工作模式,为了快速响应中断,减少中断现场保护带来的时间开销,在 FIQ 工作模式下,ARM 处理器有自己独享的 R8~R12 寄存器。

ARM 的寻址方式

  • 寄存器寻址:操作数保存在寄存器中,通过寄存器名就可以直接对寄存器中的数据进行读写。MOV R1 R2; 将寄存器R2中的值传送到R1
  • 立即数寻址:ARM 指令中的操作数为一个常数,立即数以 # 为前缀,MOV R1, #0xFF
  • 寄存器偏移寻址:将第二个操作数进行移位操作并作为新的操作数。MOV R2, R1, LSL, #3; R2=R1<<3。逻辑移位和算数移位。
  • 寄存器间接寻址:LDR R1, [R2]; 将R2中的值作为地址,取该内存地址上的数据,保存到R1
  • 基址寻址:属于间接寻址的另一种形式,不同之处在于,基值寻址将寄存器中的地址与一个便宜量相加,生成一个新地址,然后基于这个新地址去访问内存。LDR R1, [FP, #2]; 将FP中的值加2作为新地址,取该地址上的值保存到R1
  • 多寄存器寻址:STM/LDM指令就属于多寄存器寻址,一次可以传输多个寄存器的值。LDMIA SP!, {R0-R2,R14}; 将内存栈中的数据依次弹出到R14、R2、R1、R0STMDB SP!, {R0-R2,R14}; 将R0、R1、R2、R14依次压入栈
  • 相对寻址:以 PC 指针作为基地址进行寻址,比如 BBLADR 指令。

重新认识编译器

一套完整的编译器工具集,不进包含编译器,还有各种各样的工具、函数库、头文件等。不同的 ARM 编译器开发商,会根据 ARM 指令集规定的标准指令去开发各自的编译器软件。目前市面上比较常见的编译器有 ARM 公司开发的 ARM GCC 编译器、IAR ARM C/C++ 编译器、开源的 GNU GCC for ARM 交叉编译器。不同的 IDE 一般都会内嵌上面三种编译器中的一种,或者 IDE 和编译器分别独立发布。市面上各种 ARM 编译器之间的唯一的区别就是汇编指令的格式有所差异,造成差异的原因是各家编译器厂商各自扩展的伪指令不同。

猜你喜欢

转载自blog.csdn.net/weixin_39541632/article/details/131831867