寄存器 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 位形式下取得。
这是过错的。在 26 位形式下能够运用扩展的乘法;MP3 解码器就运用了它!
虽然 32 位形式的利益好象不是多的那么惊人,新近的处理器(比方 Xscale)不再支撑 26 位形式,所以 RISC OS 和它的应用程序要在 32 位环境下作业则有必要通过修正。听起来不是许多,可是假如一切补偿/改动 R15 中的 PSR 位的引证都有必要被变更为对不在 R15 中的独立的 PSR 的引证,这就忽然变成一个十分严重的问题了。还有你不能持续用一个指令来康复 PSR 并分支回到调用者,现在这需求两个独立的指令。为此代码有必要重写。你不能简略的用另一个指令来修补…