ARM微處理器程序狀態(tài)寄存器
寄存器 15 (26-bit 模式):
R15 構造如下:Bit 31 30 29 28 27 26 25------------2 1 0N Z C V I F 程 序 計 數(shù) 器 S1 S0標志的意義:
N Negative 如果結果是負數(shù)則置位Z Zero 如果結果是零則置位C Carry 如果發(fā)生進位則置位O Overflow 如果發(fā)生溢出則置位I IRQ 中斷禁用F FIQ 快速中斷禁用S1 和 S0 是處理器模式標志:S1 S0 模式0 0 USR - 用戶模式0 1 FIQ - 快速中斷模式1 0 IRQ - 中斷模式1 1 SVC - 超級用戶模式
在 R15 作為一個指令的第一個操作數(shù)的時候,只有程序計數(shù)器部分是可以獲得的。所以,下列指令把 PC 到一個寄存器中并向這個目標寄存器加上 256:
ADDR0, R15, #256
(對于 BASIC 匯編器 R15 和 PC 的意思是相同的)
在 R15 作為第二個操作數(shù)的時候,所有 32 位都是可以獲得的: 程序計數(shù)器、標志、和狀態(tài)。下列代碼段將標識當前的處理器模式:
MOV R0, #3 ; 裝載一個位掩碼(%11)到 R0 中AND R0, R0, PC ; 把 R15 與 R0 做邏輯與并把結果放入 R0,來得到模式狀態(tài)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 體系?!?h2>改變處理器的狀態(tài):要改變處理器模式、或者任何標志,我們需要用想要的標志 EOR(異或)狀態(tài)標志,新狀態(tài) = 舊狀態(tài) 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 的最初狀態(tài)存儲到 R6 中ORR R7, R6, #3 ; 設置 SVC 模式TEQP R7, #0 ; 把(在 R7 中的)模式標志寫入 PC而返回最初的模式是:
TEQP R6, #0 ; 把(在 R6 中的)最初的模式寫入 PC
你可能覺得 32 位模式不是非常有用。在當前版本的 RISC OS 下,這是事實。實際上,就我而言,32 位模式提供給你的只是:
- 訪問大于 28Mb 的區(qū)域。在 RISC OS 上這不是真的很重要,在這個系統(tǒng)里 web 瀏覽器適合于 1 M 或 2 M,而重要的藝術程序為那些非常巨大的圖象提供它們自己的虛擬內(nèi)存系統(tǒng)。
本文檔的最初版本,和最初的 ARM 匯編器指南包括...
- StrongARM 提供了兩個指令(UMUL 和 UMLA、IIRC),它們處理 64 位乘法。這只能在 32 位模式下獲得。
盡管 32 位模式的利益好象不是多的那么驚人,新近的處理器(比如 Xscale)不再支持 26 位模式,所以 RISC OS 和它的應用程序要在 32 位環(huán)境下工作則必須經(jīng)過修改。聽起來不是很多,但是如果所有補償/改變 R15 中的 PSR 位的引用都必須被變更為對不在 R15 中的獨立的 PSR 的引用,這就突然變成一個非常重大的問題了。還有你不能繼續(xù)用一個指令來恢復 PSR 并分支回到調(diào)用者,現(xiàn)在這需要兩個獨立的指令。為此代碼必須重寫。你不能簡單的用另一個指令來修補...
評論