ARM 处理器有二十七个存放器,其间一些是在必定条件下运用的,所以一次只能运用十六个…
- 存放器 0 到存放器 7 是通用存放器并能够用做任何意图。不象 80×86 处理器那样要求特定存放器被用做栈拜访,或许象 6502 那样把数学核算的成果放置到一个累加器中,ARM 处理器在存放器运用上是高度灵敏的。
- 存放器 8 到 12 是通用存放器,但是在切换到 FIQ 形式的时分,运用它们的影子(shadow)存放器。
- 存放器 13 典型的用做 OS 栈指针,但可被用做一个通用存放器。这是一个操作系统问题,不是一个处理器问题,所以假如你不运用栈,只需你今后康复它,你能够在你的代码中自在的占用(corrupt)它。每个处理器形式都有这个存放器的影子存放器。
- 存放器 14 专职持有回来点的地址以便于写子例程。当你履行带衔接的分支的时分,把回来地址存储到 R14 中。同样在程序第一次运转的时分,把退出地址保存在 R14 中。R14 的一切实例有必要被保存到其他存放器中(不是实际上有用)或一个栈中。这个存放器在各个处理器形式下都有影子存放器。一旦现已保存了衔接地址,这个存放器就能够用做通用存放器了。
- 存放器 15 是程序计数器。它除了持有指示程序当时运用的地址的二十六位数之外,还持有处理器的状况。
为更明晰一些… 供给下列图表:
User 形式 SVC 形式 IRQ 形式 FIQ 形式 APCSR0 ------- R0 ------- R0 ------- R0 a1R1 ------- R1 ------- R1 ------- R1 a2R2 ------- R2 ------- R2 ------- R2 a3R3 ------- R3 ------- R3 ------- R3 a4R4 ------- R4 ------- R4 ------- R4 v1R5 ------- R5 ------- R5 ------- R5 v2R6 ------- R6 ------- R6 ------- R6 v3R7 ------- R7 ------- R7 ------- R7 v4R8 ------- R8 ------- R8 R8_fiq v5R9 ------- R9 ------- R9 R9_fiq v6R10 ------ R10 ------ R10 R10_fiq slR11 ------ R11 ------ R11 R11_fiq fpR12 ------ R12 ------ R12 R12_fiq ipR13 R13_svc R13_irq R13_fiq spR14 R14_svc R14_irq R14_fiq lr------------- R15 / PC ------------- pc
程序计数器结构如下:
位 31 30 29 28 27 26 25------------2 1 0N Z C V I F 程 序 计 数 器 S1 S0
下面是你想知道的”形式”,比方上面提及的”FIQ”形式。
- 用户形式,运转应用程序的一般形式。约束你的内存拜访而且你不能直接读取硬件设备。
- 超级用户形式(SVC 形式),首要用于 SWI(软件中止)和 OS(操作系统)。这个形式有额定的特权,答应你进一步操控核算机。例如,你有必要进入超级用户形式来读取一个插件(podule)。这不能在用户形式下完结。
- 中止形式(IRQ 形式),用来处理建议中止的外设。这个形式也是有特权的。导致 IRQ 的设备有键盘、 VSync (在产生屏幕改写的时分)、IOC 定时器、串行口、硬盘、软盘、等等…
- 快速中止形式(FIQ 形式),用来处理建议快速中止的外设。这个形式是有特权的。导致 FIQ 的设备有处理数据的软盘,串行端口(比方在 82C71x 机器上的 A5000) 和 Econet。
IRQ 和 FIQ 之间的区别是关于 FIQ 你有必要赶快处理你工作并脱离这个形式。IRQ 能够被 FIQ 所中止但 IRQ 不能中止 FIQ。为了使 FIQ 更快,所以有更多的影子存放器。FIQ 不能调用 SWI。FIQ 还有必要禁用中止。假如一个 FIQ 例程有必要从头启用中止,则它太慢了并应该是 IRQ 而不是 FIQ。 Phew!