?? arm 指令格式和時序.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0055)http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html -->
<HTML><HEAD><TITLE>ARM Instruction Formats and Timings</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META http-equiv=Content-Language content=zh-cn>
<META content="MSHTML 6.00.2600.0" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId></HEAD>
<BODY>
<H1>ARM 指令格式和時序</H1>
<P><A
href="http://www.pinknoise.demon.co.uk/">http://www.pinknoise.demon.co.uk/</A>
<P>Last revised: 15th November 1995</P>
<P class=TITLE><A href="mailto:mhss<jijingzhisheng@up369.com>">翻譯:寒蟬退士</A></P>
<P class=TITLE><FONT
size=2><B>譯者聲明</B>:譯者對譯文不做任何形式的擔保并且不承擔任何責任,譯者對譯文不擁有任何權利并且不負擔任何義務。</FONT></P>
<HR>
<P><FONT color=#800000>The information included here is provided in good faith,
but no responsibility can be accepted for any damage or loss caused from the use
of information contained within this document even if the author has been
advised of the possibility of such loss.</FONT> <FONT
color=#800000>真誠的提供包含在此處的信息,但對由于使用本文檔包含的信息而導致的任何損害或損失不負責任,即使作者已經忠告了有這種損失的可能性。</FONT>
<P>這不是來自 ARM 公司的官方文檔;實際上只有來自 ARM
公司的一群好人給出了一些修正,他們與本文檔沒有任何聯系。他們不擔保找出了其中所有的錯誤,所以如果你找到了錯誤請不要指責他們。
<P>非常歡迎校正和/補償這個文檔。請向 Robin Watts 報告。
<P>在整個文檔中,‘字’指的是 32 位(4 字節)的內存。如果你不喜歡這樣,那就太不幸了。
<P>這個文檔有多種形式。參見<A
href="http://www.pinknoise.demon.co.uk/ARMinstrs/index.html">完整描述它們的索引</A>。
<HR>
<A name=Contents>
<H2>目錄</A> </H2>
<UL>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Modes">處理器模式</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Registers">寄存器</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Pipeline">流水線</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Timings">時序</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Instructions">指令</A>
<UL>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Condition">條件代碼</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Data">數據處理指令</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Branch">分支指令</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Multiplication">乘法</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Long">長乘法(ARM7DM)</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Transfer">單一數據傳送</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Block">塊數據傳送</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Software">軟件中斷</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#CoproOp">協處理器數據操作</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#CoproTrans">協處理器數據傳送和寄存器傳送</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Swap">單一數據交換(ARM
3 和以后,包括 ARM 2aS)</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Status">狀態寄存器傳送(ARM
6 和以后)</A>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Undefined">未定義指令</A>
</LI></UL>
<LI><A
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Credits">貢獻</A>
</LI></UL>
<HR>
<A name=Modes>
<H2>處理器模式</H2></A>
<P>ARM 有一個用戶模式和多個有特權的超級用戶模式。它們是:
<DL>
<DT>IRQ
<DD>在觸發中斷請求(IRQ)時進入。
<DT>FIQ
<DD>在觸發快速中斷請求(FIQ)時進入。
<DT>SVC
<DD>在指令一個軟件中斷(SWI)時進入。
<DT>Undef
<DD>在執行了一個未定義的指令時進入(不存在于 ARM 2 和 3,在這里進入 SVC 模式)。
<DT>Abt
<DD>在一個內存訪問嘗試被內存管理器(例如,MEMC 或
MMU)所終止時進入,通常因為所做的嘗試要訪問不存在的內存或者在沒有充足特權的模式下訪問內存(不存在于 ARM 2 和 3,在這里進入 SVC 模式)。
</DD></DL>
<P>在每種情況下還調用適當的硬件向量。
<P>
<HR>
<A name=Registers>
<H2>寄存器</H2></A>
<P>ARM 2 和 3 有 27 個 32 位處理器寄存器,在任何給定時間只有其中的 16 個是可見的(是哪十六個取決于處理器模式)。它們被引用為
R0-R15。
<P>ARM 6 和以后有 31 個 32 位處理器寄存器,在任何給定時間只有其中的 16 個是可見的。
<P>R15 特別重要。在 ARM 2 和 3,其中的 24 位用做程序計數器,而余下的 8 位用于保持處理器模式、狀態標志和中斷模式。所以 R15 經常被稱做
PC。 <PRE> R15 = PC = NZCVIFpp pppppppp pppppppp ppppppMM
</PRE>位 0-1 和 26-31 被稱為 PSR (處理器狀態寄存器)。位 2-25 給出被取回到指令流水線中的當前指令的(以字為單位)地址
(見后)。所以永遠只能從字對齊的地址執行指令。 <! center BOXED ; l VLINE l. ><PRE>M 當前處理器模式
0 用戶模式
1 快速中斷處理模式(FIQ 模式)
2 中斷處理模式(IRQ 模式)
3 超級用戶模式(SVC 模式)
</PRE><! center BOXED ;l l. ><PRE>名字 意思
N 負數(Negative)標志
Z 零(Zero)標志
C 進位(Carry)標志
V 溢出(oVerflow)標志
I 中斷(Interrupt)請求禁用
F 快速(Fast)中斷請求禁用
</PRE>
<P>R14、R14_FIQ、R14_IRQ、和 R14_SVC 由于它們在帶連接的分支指令期間的行為而有時被稱為‘連接’寄存器。
<P>ARM 6 和以后的處理器核心支持 32 位地址空間。這些處理可以在 26 為和 32 位 PC 模式二者下操作。 在 26 位 PC 模式下,R15
表現如同在以前的處理器上,所以代碼只能運行在地址空間的最低的 64M 字節中。在 32 位 PC 模式下,R15 所有 32
位用做程序計數器。使用獨立的狀態寄存器來存儲處理器模式和狀態標志。PSR 定義如下: <PRE> NZCVxxxx xxxxxxxx xxxxxxxx IFxMMMMM
</PRE>注意在 32-bit 模式下 R15 的底端兩位總是零 - 就是說你仍然只能得到字對齊的指令。忽略對這兩位寫非零的任何嘗試。
<P>當前定義了下列模式: <! center BOXED ; l VLINE c VLINE l. ><PRE>M 名字 意思
00000 usr_26 26 位 PC Usr 模式
00001 fiq_26 26 位 PC FIQ 模式
00010 irq_26 26 位 PC IRQ 模式
00011 svc_26 26 位 PC SVC 模式
10000 usr_32 32 位 PC Usr 模式
10001 fiq_32 32 位 PC FIQ 模式
10010 irq_32 32 位 PC IRQ 模式
10011 svc_32 32 位 PC SVC 模式
10111 abt_32 32 位 PC Abt 模式
11011 und_32 32 位 PC Und 模式
</PRE>
<P>推測自上面的表,可能期望還定義了下列兩個模式: <! center BOXED ; l VLINE c VLINE l. ><PRE>M 名字 意思
00111 abt_26 26 bit PC Abt Mode
01011 und_26 26 bit PC Und Mode
</PRE>實際上未定義它們(如果你確實向模式位寫了 00111 或 01011,結果的芯片狀態不會是你所希望的 - 就是說不會是有適當的 R13 和 R14
被交換進來的一個 26-bit 特權模式。
<P>下表展示在每個處理器模式下可獲得那些的寄存器: <PRE> +------+---------------------------------------+
| 模式 | 可獲得的寄存器 |
+------+---------------------------------------+
| USR | R0 - R14 R15 |
+------+---------+-----------------------------+
| FIQ | R0 - R7 | R8_FIQ - R14_FIQ R15 |
+------+---------+----+------------------------+
| IRQ | R0 - R12 | R13_IRQ - R14_IRQ R15 |
+------+--------------+------------------------+
| SVC | R0 - R12 | R13_SVC - R14_SVC R15 |
+------+--------------+------------------------+
| ABT | R0 - R12 | R13_ABT - R14_ABT R15 | (ARM 6 和以后)
+------+--------------+------------------------+
| UND | R0 - R12 | R13_UND - R14_UND R15 | (ARM 6 和以后)
+------+---------------------------------------+
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -