?? arm 指令格式和時序.htm
字號:
FD IA DB
</PRE>S 為控制兩個特殊的功能,它們被匯編器指示為在指令的結束處放置“^”:
<UL>
<LI>如果設置了 S 位,并且指令是 LDM 而 R15 在寄存器列表中,則:
<UL>
<LI>在 26-bit 特權模式下,裝載 R15 的所有 32 位。
<LI>在 26-bit 用戶模式下,裝載 R15 的 4 個標志位和 24 個 PC 位。忽略裝載值的位 27、26、1 和 0。
<LI>在 32-bit 模式下,裝載 R15 的所有 32 位,但要注意底端的兩位總是零,所以忽略裝載到它們的任何東西。除此之外,把當前模式的
SPSR 傳送到 CPSR;因為用戶模式沒有 SPSR,這種類型的指令不應該用在 32-bit 用戶模式下。 </LI></UL>
<LI>如果設置了 S 位,并且要么指令是 STM 要么 R15
不在寄存器列表中,則傳送用戶模式的寄存器而不是當前模式的寄存器。在用戶模式下不應該使用這個指令。 </LI></UL>
<P>特殊情況發生在基址寄存器存在于要傳送的寄存器列表中的時候。
<UL>
<LI>基址寄存器總是可以被裝載而沒有任何問題。但是,如果基址寄存器被裝載則不能指定寫回 - 你不能同時把寫回值和裝載值二者寫到基址寄存器中!
<LI>如果不使用寫回則可以存儲基址寄存器而沒有任何問題。
<LI>如果在存儲包含基址寄存器的一個寄存器列表的時候使用了寫回,則只有在基址寄存器是列表的第一個的情況下,才在寫回之前寫基址寄存器的值到內存。其他情況,寫到內存中的值未被定義。
</LI></UL>
<P>進一步的特殊情況發生在程序計數器存在于要裝載和保存的寄存器列表中。
<UL>
<LI>(在 26 位模式下) PSR 總是與 PC 一起保存((在所有模式下) PC 總是超出當前執行的指令的地址 12 字節,而不是通常的 8 字節)。
<LI>在裝載時,只有在設置了 S 位的時候,才影響 PSR 的在當前模式下可改變的位。 </LI></UL>
<P>PC 不應該作為基址寄存器。
<P>塊裝載使用 nS + 1N + 1I + (1S + 1N 如果改變了 PC )個周期,而塊存儲使用 (n-1)S + 2N
個周期,這里的“n”是被傳送的字的數目。
<P><A name=Software>
<H3>軟件中斷</H3></A><PRE>xxxx1111 yyyyyyyy yyyyyyyy yyyyyyyy
</PRE>
<P>典型的匯編語法: <PRE> SWI "OS_WriteI"
SWINE &400C0
</PRE>
<P>在遇到軟件中斷的時候,ARM 切換到 SVC 模式中,把 R15 的當前值保存到 R14_SVC 中,并跳轉到內存中的位置 8,它假定在這里可以找到一個
SWI 處理例程來解碼剛才執行的 SWI 指令的低 24 位,并以特定于操作系統的方式做與 SWI 編號有關的事情。
<P>在 ARM 上寫的操作系統典型的使用 SWI 來為編程者提供各種例程。
<P>執行 SWI 指令使用 2S + 1N 個周期(加上解碼 SWI 編號和執行適當例程使用的時間)。
<P><A name=CoproOp>
<H3>協處理器數據操作</H3></A><PRE>xxxx1110 oooonnnn ddddpppp qqq0mmmm
</PRE>
<P>典型的匯編語法: <PRE> CDP p, o, CRd, CRn, CRm, q
CDP p, o, CRd, CRn, CRm
</PRE>
<P>把這個指令傳遞給協處理器 p,告訴它在協處理器寄存器 CRn 和 CRm 上,進行操作 o,并把結果放置到 Crd 中。
<P>可以使用 qqq 提供與操作有關的補充信息。
<P>這些指令的準確意思依賴于使用的特定的協處理器;上面只是推薦的位的用法(實際上 FPA 就不遵守它)。 唯一強制的部分是 pppp 必須是協處理器編號:
協處理器設計者自由的按需要分配 oooo、nnnn、dddd、qqq 和 mmmm。
<P>如果協處理器以與推薦的不同的方式使用這些位,可能需要使用匯編器宏來對人有意義的指令語法轉換成正確的 CDP 指令。對最常使用的協處理器如
FPA,許多匯編器有額外的內置助記符并自動做這個轉換。(例如,匯編 MUFEZ F0,F1,#10 成等價的 CDP 1,1,CR0,CR9,CR15,3。)
<P>當前定義的協處理器編號包括: <! center BOXED ; l l. ><PRE>1 和 2 浮點單元
15 Cache 控制器
</PRE>
<P>如果做了到協處理器的一個調用而協處理器未做響應(通常因為它不存在!),則調用未定義指令向量(完全同于后面描述的未定義指令)。這用于在沒有 FPA
的機器上透明的提供 FP 支持。
<P>執行這些指令使用 1S + bI 個周期,這里的 b 是協處理器在接受指令之前導致 ARM 忙等的周期數目: 這在協處理器控制之下。
<P><A name=CoproTrans>
<H3>協處理器數據傳送和寄存器傳送</H3></A><PRE>xxxx110P UNWLnnnn DDDDpppp oooooooo LDC/STC
xxxx1110 oooLNNNN ddddpppp qqq1MMMM MRC/MCR
</PRE>
<P>它們還是依賴于使用的特定協處理器 p。
<P>N 和 D 表示協處理器寄存器編號,n 和 d 是 ARM 處理器編號。o 是協處理器使用的操作。 M 表示協處理器自由的按需使用的位。
<P>在第一種形式中,如果 L=1 則表示 LDC,否則是 STC。這些指令分別的表現得象 LDR 或 STR,在帶有立即數偏移量的各種情況下,有下列例外。
<UL>
<LI>偏移量是 4*(oooooooo),不是通常的 12-bit 常數。
<LI>如果指定了 P=0 (過后變址),則 W 必須是 1,而 W 是 1 只是指示要求寫回,而不是告訴內存系統 這是一個用戶模式傳送。為將來的擴充保留
P=0 和 W=0 的指令。
<LI>在裝載或存儲一個或更多協處理器寄存器時,協處理器從 DDDD 和 N 位確定要裝載或存儲多少和哪個寄存器: ARM
所做的就是傳送一個字到/從指示的地址,接著傳送另一個到/從指示的地址 + 4,接著傳送一個到/從指示的地址 + 8,以此類推,直到協處理器告訴它停止。
<LI>作為慣例,DDDD 表示要裝載或存儲的(第一個)協處理器寄存器,而 N 以某種方式表示長度,使用 N=1
指示一個“長”形式。協處理器設計者可以自由的忽略它...
<LI>下面是匯編語法: <PRE>LDC p,CRd,[Rn,#20] ;短形式 (N=0), 預先變址
STCL p,CRd,[Rn,#-32]! ;長形式 (N=1), 帶寫回的預先變址
LDCNEL p,CRd,[Rn],#-100 ;長形式 (N=1), 過后變址
</PRE></LI></UL>
<P>在第二種形式中,如果 L=1 則表示 MRC, 否則是 MCR。MRC 傳送一個協處理器寄存器到一個 ARM 寄存器, MCR
做反方向傳送(字母看起來象是寫反了,記住在 ARM 匯編器中目的通常寫在左邊)。
<P>MCR 傳送 ARM 寄存器 Rd 的內容到協處理器。協處理器基于 ooo、dddd、qqq 和 MMMM
字段的值自由的做它想做的任何事情,盡管有一個“標準的”解釋: 把它寫到協處理器寄存器 CRN,使用操作 ooo,用 CRM 和 qqq
提供可能的補充控制。匯編語法是: <PRE> MCR p,o,Rd,CRN,CRM,q
</PRE>
<P>給 MCR 指令的 Rd 不應該是 R15。
<P>MRC 從協處理器傳送一個單一的字并把它放置到 ARM 寄存器 Rd 中。協處理器使用與 MCR
相同的字段自由的以任何方式生成這個字,有一個標準的解釋:它來自 CRN,使用操作 ooo,用 CRM 和 qqq 提供可能的補充控制。匯編語法是: <PRE> MRC p,o,Rd,CRN,CRM,q
</PRE>
<P>如果給 MRC 指令的 Rd 是 R15,使用傳送的字的頂端 4 位來設置標志;丟棄余下的 28 位。(例如,這種機制用于浮點比較指令。)
<P>執行 LDC 和 STC 使用 (n-1)S + 2N + bI 個周期, MRC 使用 1S+bI+1C 個周期,而 MCR 使用 1S +
(b+1)I + 1C 個周期,這里的 b 是協處理器在接受指令之前導致 ARM 忙等的周期數目: 這在協處理器控制之下,而 n
是傳送的字的數目(注意這在協處理器而不是 ARM 的控制下)
<P><A name=Swap>
<H3>單一數據交換(ARM 3 和以后,包括 ARM 2aS)</A> </H3><PRE>xxxx0001 0B00nnnn dddd0000 1001mmmm
</PRE>
<P>典型的匯編語法: <PRE> SWP Rd, Rm, [Rn]
</PRE>
<P>這些指令裝載一個內存的一個字(用寄存器 Rn 給出地址)到一個寄存器 Rd 并存儲寄存器 Rm 到相同的地址。Rm 和 Rd
可以是同一個寄存器,在這種情況下交換寄存器和內存位置的內容。裝載和存儲操作通過設置 LOCK
引角(pin)為高電平來在操作期間鎖定在一起,這指示內存管理器它們應當被沒有中斷的完成。
<P>如果設置了 B 位,則傳送一字節的內存,否則傳送一個字。
<P>Rd、Rn、和 Rm 都不能是 R15。
<P>執行這個指令使用 1S + 2N + 1I 個周期。
<P><A name=Status>
<H3>狀態寄存器傳送(ARM 6 和以后)</A> </H3><PRE>xxxx0001 0s10aaaa 11110000 0000mmmm MSR 寄存器形式
xxxx0011 0s10aaaa 1111rrrr bbbbbbbb MSR 立即數形式
xxxx0001 0s001111 dddd0000 00000000 MRS
</PRE>
<P>典型的匯編語法: <PRE> MSR SPSR_all, Rm ;aaaa = 1001
MSR CPSR_flg, #&F0000000 ;aaaa = 1000
MSRNE CPSR_ctl, Rm ;aaaa = 0001
MRS Rd, CPSR
</PRE>
<P>設置 s 位時意味著訪問當前特權模式的 SPSR,而不是 CPSR。只能在特權模式下執行這個命令的時候設置此位。
<P>使用 MSR 來傳送一個寄存器或常數到一個狀態寄存器。
<P>aaaa 位接受下列值: <! center BOXED ; l l. ><PRE>值 意思
0001 設置有關的 PSR 的控制位。
1000 設置有關的 PSR 的標志位。
1001 設置有關的 PSR 的控制位和標志位(就是說所有現存的位)。
</PRE>其他的值為將來的擴充而保留。
<P>在寄存器形式中,源寄存器是 Rm。在立即數形式中,來源是 #b, ROR #2r。
<P>R15 不應該被指定為 MRS 指令的源寄存器。
<P>使用 MRS 來傳送處理器的狀態到一個寄存器。
<P>dddd 位存儲目的寄存器的編號;Rd 一定不能是 R15。
<P>N.B. 指令編碼對應于對應與操作碼(opcode)是 10xx 并清除了 S 位的數據處理指令(就是測試指令)。
<P>執行這些指令總是使用 1S 個周期。
<P><A name=Undefined>
<H3>未定義指令</H3></A><PRE>xxxx0001 yyyyyyyy yyyyyyyy 1yy1yyyy 專屬 ARM 2
xxxx011y yyyyyyyy yyyyyyyy yyy1yyyy
</PRE>
<P>這些指令目前未定義。在遇到未定義指令時,ARM 切換到 SVC 模式(在 ARM 3 和以后)或 Undef 模式(在 ARM 6 和以后),把 R15
的舊有值放置到 R14_SVC (或 R14_UND)中并跳轉到一個位置,在那里它希望找到解碼這個未定義指令的代碼并相應的執行它。
<P>注意:
<UL>
<LI>這些指令被文檔為“未定義的”,原因是這種方式下它們進入未定義指令處理器陷阱。許多其他指令是以更寬松的方式未被定義的,而不說出它們做什么。
例如,下面形式的位模式(pattern): <PRE> xxxx0000 01xxxxxx xxxxxxxx 1001xxxx
</PRE>與數據處理的指令、乘法、長乘法和 SWP 指令有關,但卻不是其中一個的原因是:
<UL>
<LI>數據處理指令的位 25 = 0 和位 4 = 1 時有寄存器控制的移位,所以必須位 7 = 0。
<LI>乘法指令的位 23:22 = 00。
<LI>長乘法指令的位 23:22 = 1U。
<LI>SWP指令的位 24 = 1。
</LI></UL>這些指令只是簡單的未定義做什么,但是上面列出的那些指令實際上<B>定義</B>為進入未定義指令陷阱,至少直到將來為它們找到某種用途。
<LI>注意“專屬 ARM2”的未定義指令包括了在 ARM3/ARM2as 和以后成為 SWP 的那些指令。 </LI></UL>
<P>
<HR>
<A name=Credits>
<H2>Credits</H2></A>
<P>This document was originally written by Robin Watts, with considerable
consultation with Steven Singer. It was then later updated by Mark Smith to
include more information on ARMs later than 2.
<P>David Seal provided a huge list of corrections and amendments, and
unwittingly provided the basis for the timing information in a posting to
usenet.
<P>Various corrections were also submitted/posted by Olly Betts, Clive Jones,
Alain Noullez, John Veness, Sverker Wiberg and Mark Wooding.
<P>Thanks to everyone that helped (and if I have missed you here, please let me
know.)
<P><B>Just because I have included peoples addresses here, please do not take
this as an invitation to mail them any questions you may have!</B> <PRE>Olly Betts olly@mantis.co.uk
Paul Hankin pdh13@cus.cam.ac.uk
Robert Harley robert@edu.caltech.cs
Clive Jones Clive.Jones@armltd.co.uk
Alain Noullez anoullez@zig.inria.fr
David Seal <address withheld by request>
Steven Singer s.singer@ph.surrey.ac.uk
Mark Smith ee91mds2@brunel.ac.uk
John Veness john@uk.ac.ox.drl
Robin Watts Robin.Watts@comlab.ox.ac.uk
Sverker Wiberg sverkerw@Student.csd.UU.SE
Mark Wooding csuov@csv.warwick.ac.uk
</PRE>
<P>For those not on the internet, messages can be sent by snail mail to: <PRE>Robin Watts
St Catherines College,
Oxford,
OX1 3UJ
</PRE></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -