一、什么是ARM汇编?
- 运行在ARM处理器上的汇编语言就叫ARM汇编。
- C程序运行在X86平台,底层就是X86汇编;运行在ARM平台,底层就是ARM汇编。ARM汇编与X86汇编有显著区别。
- X86属于CISC(复杂指令集);ARM属于RISC(精简指令集)。
二、CISC存在的问题:
指令系统庞大,指令功能复杂,指令格式、寻址方式多;执行速度慢;功耗大;难以优化编译;编译程序复杂;80%的指令在20%的运行时间使用;无法兼容等。
三、RISC特点:
- 简单的指令集---RISC指令集只提供很有限的操作,基本上单周期指向每条指令,其指令长度也是固定的(一般4个字节)。CISC指令复杂丰富,功耗大,长度不固定(1到6个字节)。
- Load-Store架构---在RISC中,CPU并不会对内存中的数据进行操作,所有的计算都要求在寄存器中完成。而寄存器和内存的通信则由单独的指令来完成。而在CISC中,CPU是可以直接对内存进行操作的。
- 更多的寄存器---和CISC相比。基于RISC的处理器有更多的通用寄存器可以使用,且每个寄存器都可以进行数据存储或者寻址。
- RISC指令集能够非常有效的适合于采用流水线、超流水线和超标量技术,从而实现指令级并进行操作,提高处理器性能。
四、CISC VS RISC
RISC与CISC的主要特征对比 | ||
比较内容 | CISC | RISC |
指令系统 | 复杂、庞大 | 简单、精简 |
指令数目 | 一般大于200 | 一般小于100条 |
指令格式 | 一般大于4 | 一般小于4种 |
指令字长 | 不固定 | 等长 |
可访存指令 | 不加限制 | 只有LOAD/STORE指令 |
指令使用频率 | 相缠很大 | 相差不大 |
指令执行时间 | 相差很大 | 绝大多数在一个周期内完成 |
优化编译实现 | 很难 | 较容易 |
程序源代码长度 | 较短 | 较长 |
控制器实现方式 | 绝大多数为微程序控制 | 绝大多数为硬布线控制 |
软件系统开发时间 | 较短 | 较长 |
五、什么是寄存器?
寄存器(register)是CPU的一个组成部分,里面存放着指令、数据和地址等供CPU计算使用,速度比较快。寄存器分为通用寄存器(完成通用的计算功能,谁都可以使用),和专用寄存器(状态寄存器,下一条执行指令寄存器,栈寄存器等,不能随便修改)。
六、ARM微处理器的工作状态一般有两种,并可在两种状态之间切换。
- 第一种为ARM状态,此时处理器执行32位的字对齐的ARM指令;第二种为Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。
- 在程序的执行过程中,微处理器可以随时在两种工作状态之间切换,并且,处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容。但ARM微处理器在开始执行代码时,应该处于ARM状态。
- 进入Thumb状态:当操作数寄存器的状态位(位0)为1时,可以采用执行BX指令的方法,使微处理器从ARM状态切换到Thumb状态。此外,当处理器处于Thumb状态时发生异常(如IRQ、FIQ、Undef、Abort、SWI等),则异常处理返回时,自动切换到Thumb状态。
- 进入ARM状态:当操作数寄存器的状态位为0时,执行BX指令时可以使微处理器从Thumb状态切换到ARM状态。此外,在处理器进行异常处理时,把PC指针放入异常模式链接寄存器中,并从异常向量地址开始执行程序,也可以使处理器切换到ARM状态。
-
ARM 指令:当前执行的 PC 和与看到的 PC 相差 8,即看汇编时,需要 pc+8 才是真正的 pc;
Thumb 指令:当前执行的 PC 和与看到的 PC 相差 4即 看汇编时,需要 pc+4 才是真正的 pc。(下图为ARM指令流水线 )
七、ARM微处理器支持7种运行模式。
- 用户模式(USR):ARM处理器正常的程序执行状态。
- 快速中断模式(FIQ):用于高速数据传输或通道处理。
- 外部中断模式(IRQ):用于通用的中断处理。
- 管理模式(SVC):操作系统使用的保护模式。
- 数据访问终止模式(ABT):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。
- 系统模式(SYS):运行具有特权的操作系统任务。
- 未定义指令中止模式(UND):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。
- ARM微处理器的运行模式可以通过软件改变,也可以通过外部中断或异常处理改变。大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。
- 除用户模式以外,其余的所有6种模式称之为非用户模式,或特权模式;其中除去用户模式和系统模式以外的5种又称为异常模式,常用于处理中断或异常,以及需要访问受保护的系统资源等情况。
八、ARM寄存器
ARM处理器共有37个寄存器。其中包括:31个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器。以及6个32位状态寄存器。
未分组寄存器:它们都共享R0到R7的通用寄存器,即只有一个寄存器;
分组寄存器:R8-R12 :两个(FIQ拥有自己独立的R8-R12的通用寄存器,其它六种处理模式共享R8-R12的通用寄存器。);
所谓的分组寄存器,是指一个寄存器在不同模式下有对应不同的寄存器,比如SP,在abort模式下sp_abt,在undefined模式下是sp_und,在irq模式下是sp_irq,进入各种模式后会自动切换映射到各个模式下对应的寄存器。
1 个固定的程序计数器 : PC (又称 R15),总是指向正在取值的指令,类似于X86的EIP寄存器。
当前程序状态寄存器 :CPSR。不能被同时访问,一种模式下最多同时访问 18 个寄存器。