ARM微处理器程序状态寄存器
寄存器 15 (26-bit 模式):
R15 构造如下:Bit 31 30 29 28 27 26 25------------2 1 0N Z C V I F 程 序 计 数 器 S1 S0标志的意义:
N Negative 如果结果是负数则置位Z Zero 如果结果是零则置位C Carry 如果发生进位则置位O Overflow 如果发生溢出则置位I IRQ 中断禁用F FIQ 快速中断禁用S1 和 S0 是处理器模式标志:S1 S0 模式0 0 USR - 用户模式0 1 FIQ - 快速中断模式1 0 IRQ - 中断模式1 1 SVC - 超级用户模式
在 R15 作为一个指令的第一个操作数的时候,只有程序计数器部分是可以获得的。所以,下列指令把 PC 到一个寄存器中并向这个目标寄存器加上 256:
ADDR0, R15, #256
(对于 BASIC 汇编器 R15 和 PC 的意思是相同的)
在 R15 作为第二个操作数的时候,所有 32 位都是可以获得的: 程序计数器、标志、和状态。下列代码段将标识当前的处理器模式:
MOV R0, #3 ; 装载一个位掩码(%11)到 R0 中AND R0, R0, PC ; 把 R15 与 R0 做逻辑与并把结果放入 R0,来得到模式状态CMP R0, #3 ; 把模式与 3 相比较(SVC)BEQ svc ; 如果等于 SVC 模式,分支到 svcCMP R0, #2 ; 把模式与 2 相比较 (IRQ)BEQ irq ; 如果等于 IRQ 模式,分支到 irqCMP R0, #1 ; 把模式与 1 相比较(FIQ)BEQ fiq ; 如果等于 FIQ 模式,分支到 fiqCMP R0, #0 ; 把模式与 0 相比较(USR)BEQ usr ; 如果等于 USR 模式,分支到 usr这个例子不遵从 32-bit 体系。
改变处理器的状态:
要改变处理器模式、或者任何标志,我们需要用想要的标志 EOR(异或)状态标志,新状态 = 旧状态 EOR (1 << 28)可以成为改变 oVerflow 标志的伪码。但是我们不能做这个简单的EORS操作,原因是这将导致随后的两个指令被跳过。不要担心,指令TEQ做一个假装的 EOR (结果不存储到任何地方)。把它与P后缀组合,则把结果的第 0、1、和 26 至 31 位直接写到 R15 的第 0、1、和 26 至 31 位,这是改变标志的一个简便的方法:TEQPR15, bit_mask如果你处在允许你设置一个标志的一个模式中,则你只可以改变这个标志。
这个例子不遵从 32-bit 体系。
可以被扩充它来改变处理器模式。例如,要进入 SVC 模式你可以:
MOV R6, PC ; 把 PC 的最初状态存储到 R6 中ORR R7, R6, #3 ; 设置 SVC 模式TEQP R7, #0 ; 把(在 R7 中的)模式标志写入 PC而返回最初的模式是:
TEQP R6, #0 ; 把(在 R6 中的)最初的模式写入 PC
你可能觉得 32 位模式不是非常有用。在当前版本的 RISC OS 下,这是事实。实际上,就我而言,32 位模式提供给你的只是:
- 访问大于 28Mb 的区域。在 RISC OS 上这不是真的很重要,在这个系统里 web 浏览器适合于 1 M 或 2 M,而重要的艺术程序为那些非常巨大的图象提供它们自己的虚拟内存系统。
本文档的最初版本,和最初的 ARM 汇编器指南包括...
- StrongARM 提供了两个指令(UMUL 和 UMLA、IIRC),它们处理 64 位乘法。这只能在 32 位模式下获得。
尽管 32 位模式的利益好象不是多的那么惊人,新近的处理器(比如 Xscale)不再支持 26 位模式,所以 RISC OS 和它的应用程序要在 32 位环境下工作则必须经过修改。听起来不是很多,但是如果所有补偿/改变 R15 中的 PSR 位的引用都必须被变更为对不在 R15 中的独立的 PSR 的引用,这就突然变成一个非常重大的问题了。还有你不能继续用一个指令来恢复 PSR 并分支回到调用者,现在这需要两个独立的指令。为此代码必须重写。你不能简单的用另一个指令来修补...
评论