ARM微處理器的指令集

Download Report

Transcript ARM微處理器的指令集

第六章
ARM微處理器的指令集
DMATEK CO.,LTD
深圳市長高科技有限公司
本章節將對ARM指令集中的六大類指令進行詳細的說明與描述。
本章的主要內容有:
- 介紹跳躍指令
- 說明資料處理指令
- 介紹乘法相關指令
- 介紹程式狀態存取指令
- 說明載入與儲存指令
- 資料交換指令
- 位移位元指令
- 輔助運算器操作指令
- 異常產生指令
- 介紹虛擬指令
 6-1 跳躍指令:
 跳躍指令用於實現程式流程的跳躍,在ARM程式中有兩種方法可以實現程式流程
的跳躍:
—使用專門的跳躍指令。
—直接向程式計數器PC寫入跳躍位址值。
 透過向PC程式計數器寫入跳躍位址值,可以實現在4GB的位址空間中的任意跳躍
,在跳躍之前結合使用,如MOV
LR,PC等類似指令,可以保存儲存將來的
返回位址值,從而實現在4GB連續的線性位址空間的副程式的呼叫使用。
 ARM指令集中的跳躍指令可以完成從當前指令向前或向後的32MB的位址空間的
跳躍,包括以下4條指令:
■ B,Branch,跳躍指令
■ BL,Branch with Link,包含返回的跳躍指令,也即是呼叫副程式。
■ BLX,Branch and Exchange Instruction Set包含返回和狀態切換的跳躍指令
■ BX,Branch with Link and Exchange Instruction Set,包含狀態切換的跳躍指
令
以下,稍微介紹這幾個指令:
 B指令
 B指令的格式為:
 B{條件}
目標位址
 B指令是最簡單的跳躍指令。一旦遇到一個 B指令,ARM 處理器將立即跳躍到所
設定的目的位址,並從那裏繼續執行。注意到,儲存在跳躍指令中的實際值是相
對當前PC值的一個偏移量,而不是一個絕對位址,這個值可由組譯器來計算出
來(參考定址方式中的相對定址)。而其是 24 位元有號數,在左移兩位元後,
有號數擴展為 32 位,且增加至PC的值上,因此,這個指令可以設定32表示的有
效偏移為 26 位(前後32MB的位址空間)。以下指令:
B
Label
;程式無條件跳躍到標號Label處執行
CMP R1,#0
;當CPSR暫存器中的Z條件碼置位元時,
程 式跳躍到標號Label處執行
BEQ
Label

1. BL指令
BL指令的格式為:
BL{條件}
目標位址
BL 是另一個跳躍指令,但跳躍之前,會在暫存器R14中保存儲存PC的當前內容
,因此,可以透過將R14 的內容重新載入到PC中,來返回到跳躍指令之後的那
個指令處執行。該指令是實現副程式調用的一個基本但常用的手段。以下指令
:
BL Label
;當程式無條件跳躍到標號Label處執行時,同時將當
前的PC值保存儲存到R14中

2. BLX指令
BLX指令的格式為:
BLX 目標位址
BLX指令從ARM指令集跳躍到指令中所指定的目標位址,並將處理器的工作狀
態有ARM狀態切換到Thumb狀態,該指令同時將PC的當前內容保存儲存到暫存
器R14中。因此,當副程式使用Thumb指令集,而調用者使用ARM指令集時,可
以透過BLX指令實現副程式的調用和處理器工作狀態的切換。同時,副程式的返
回可以透過將暫存器R14值複製到PC中來完成。

3. BX指令
BX指令的格式為:
BX{條件} 目標位址
BX指令跳躍到指令中所指定的目標位址,目標位址處的指令既可以是ARM
指令,也可以是Thumb指令。
接下來我們利用ADS及AXD來測試BL的指令,如下圖6-1所示,當執行到BL
時,會跳到Delay裡面的副程式,而沒去執行圖中第8行,等副程式執行完畢後
,才會再跳回主程式接第8行繼續執行下去。圖6-1第7行,副程式執行完畢,
跳回主程式的語法。
BL執行前
BL執行後
圖6-1執行BL程式指令結果示意圖
 6-2 資料處理指令:
 資料的算術運算指令和資料處理指令的特徵是兩個運算元一起經過運算,產生一個
結果,指令執行影響旗標暫存器。資料的算術運算要求有兩個運算元,規定一個運
算元的尋址方式必須是暫存器類型,另一個可以是暫存器類型、常數類型或者移位
元定址方式。
 ARM的資料處理指令可分為資料傳送指令、算術邏輯運算指令、比較測試指令、
乘法與乘加指令等。
 資料傳送指令用於在暫存器和記憶體之間進行資料的雙向傳輸。
 算術邏輯運算指令完成常用的算術與邏輯的運算,該類指令不但將運算結果保存儲
存在目的暫存器中,同時更新CPSR中的相應條件旗標位元。
 比較測試指令不保存儲存運算結果,只更新CPSR中相應的條件旗標位元。
 乘法指令與乘加指令可分為運算結果為32位和運算結果為64位兩類,與前面的資
料處理指令不同,指令中的所有運算元、目的暫存器必須為通用暫存器,不能對運
算元使用常數或被移位的暫存器,同時,目的暫存器和運算元1必須是不同的暫存
器。
 資料處理指令包括:
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
MOV
MVN
CMP
CMN
TST
TEQ
ADD
ADC
SUB
SBC
RSB
RSC
AND
ORR
EOR
BIC
資料傳送指令
資料取補數傳送指令
比較指令
反值比較指令
位元測試指令
相等測試指令
加法指令
帶進位元加法指令
減法指令
帶借位減法指令
逆向減法指令
帶借位的逆向減法指令
邏輯AND指令
邏輯OR指令
邏輯異或指令
位元清除指令

1. MOV指令
MOV指令的格式為:
MOV{條件}{S}目的暫存器,源運算元來源運算元
MOV指令的功能為:
MOV指令可完成從另一個暫存器、被移位的暫存器或將一個常數載入到目的
暫存器。如果指令中使用兩個相同的暫存器,指令的作用則相當於NOP的功能
。指令中S選項決定指令的操作是否影響CPSR中條件旗標位元的值,當沒有S時
指令不更新CPSR中條件旗標位元的值。
指令示例:
MOV R1, R0 ; 將暫存器R0的值傳送到暫存器R
MOV PC, R14
; 將暫存器R14的值傳送到PC,常用於副程式返回
MOV R1, R0, LSL#3
;將暫存器R0的值左移3位後傳送到R1
旗標位元:
如果指令中設置S位元,執行時則設置N和Z旗標;並且如果使用移位元定址方式
,則C旗標位元設置為被移出的最後一位;本指令執行不影響V旗標。
使用AXD執行MOV指令產生的結果,如下圖6-2所示,第5行指令,是將0x1234
的數值寫到R0暫存器,然後執行6行MOV的指令,將R0的值傳送到R1,所以在執行
MOV後,可以從下圖6-2可以看到R0的值傳送到R1的暫存器位置。
執行MOV前
執行MOV後
圖6-2執行MOV程式指令結果示意圖

2. MVN指令
MVN指令的格式為:
MVN{條件}{S}目的暫存器,源運算元來源運算元
MVN指令的功能為:
MVN指令可完成從另一個暫存器、被移位的暫存器或將一個常數載入到目的
暫存器。與MOV指令不同之處是在傳送之前按位元被取補數了,即把一個被取
補數的值傳送到目的暫存器中。其中,S決定指令的操作是否影響CPSR中條件
旗標位元的值,當沒有S時指令不更新CPSR中條件旗標位元的值。
指令示例:
MVN
R0, #0
;將常數0取補數傳送到暫存器R0中,完成後R0=-1
旗標位元:
如果指令中設置S位元,執行時則影響N和Z旗標;並且如果使用移位元定
址方式,則C旗標設置為被移出的最後一位;本指令執行不影響V旗標。
使用AXD執行MVN指令產生的結果,如下圖6-3所示,在執行第6行程式
之前,R0的暫存器的值是0x00000000,沒有數值,執行第6行指令時,MVN
會先取反向,所以執行完第6行程式,R0暫存器的值取反向為0XFFFFFFFF,
如下圖6-3執行後的畫面。
執行MVN前
執行MVN後
圖6-3執行MOV程式指令結果示意圖
CMP指令
CMP指令的格式為:
CMP{條件}運算元1,運算元2
CMP指令的功能為:
CMP指令用於把一個暫存器的內容和另一個暫存器的內容或常數進行比較,同
時更新CPSR中條件旗標位元的值。該指令進行一次減法運算,但不儲存結果,只
更改條件旗標位元旗標位元表示的是運算元1與運算元2的關係(大、小、相等),例
如,當運算元1大於操作運算元2時,則此後的有GT尾碼的指令將可以執行。顯然
指令中不需要指定S尾碼即更改狀態旗標,如果設定S,尾碼則被忽略。
指令示例:
CMP
R1, R0 ;將暫存器R1的值與暫存器R0的值相減,並根據結果設
置 CPSR的旗標位元
CMP
R1, #100 ;將暫存器R1的值與常數100相減,並根據結果設置
CPSR的旗標位元
旗標位元:
指令執行結束設置N和Z位。
使用AXD執行CMP指令產生的結果,如下圖6-4所示,在執行前的
CPSR的值是0x000000D3,將暫存器R1的值與R2的值相減,當執行完後,會根
據結果來設定CPSR的條件旗標 位元,所以值被改變如下0x200000D3。
執行CMP前
執行CMP後
圖6-4執行CMP指令結果示意圖


3. CMN指令
CMN指令的格式為:
CMN{條件}運算元1,運算元2
CMN指令的功能為:
CMN指令用於把一個暫存器的內容和另一個暫存器的內容或常數取補數後
進行比較,同時更新CPSR中條件旗標位元的值。該指令實際完成運算元1和運
算元2相加,並根據結果更改條件旗標位元。
指令示例:
CMN
R1, R0 ;將暫存器Rl的值與暫存器R0的值相加,並根據結果設置
CPSR的旗標位元
CMN
R1, #100 ;將暫存器R1的值與常數100相加,並根據結果設置
CPSR的旗標位元
旗標位元:
指令執行結束設置N和Z位。執行CMN後
使用AXD執行CMN指令產生的結果,如下圖6-5所示,在執行前的CPSR的值
是0x000000D3,將暫存器R1的值與R2的值相加,當執行完後,會根據結果來
設定CPSR的條件旗標位元,所以值被改變如下0x200000D3。
執行CMN前
執行CMN後
圖6-5執行CMN指令結果示意圖

4. TST指令
TST指令的格式為:
TST{條件}運算元1,運算元2
TST指令的功能為:
TST指令用於把一個暫存器的內容和另一個暫存器的內容或常數進行按位
元與運算,並根據運算結果更新CPSR中條件旗標位元的值。運算元1是要測
試的資料,而運算元2是一個位元遮罩,該指令一般用來檢測是否設置了特定
的位。TST的S位總是設置的,也就是說,它總是影響旗標位元,不需要指定
S尾碼。
指令示例:
TST
R1, #l
;用於測試在暫存器R1中是否設置了最低位元
TST
R1, #0xffe ;將暫存器R1的值與常數0xffe按位元與,並根據結果
設置CPSR的旗標位元
旗標位元:
在結果中設置N和Z旗標,如果使用移位元定址方式,則從它得到C旗標,不
影響V旗標。
使用AXD執行TST指令產生的結果,如下圖6-6所示,在執行前的CPSR的值
是0x000000D3,將暫存器R1的值與R2依序做AND邏輯運算,當執行完後,會根
據結果來設定CPSR的條件旗標位元,所以值被改變如下0x400000D3。
執行TST前
執行TST後
圖6-6執行TST指令結果示意圖

5. TEQ指令
TEQ指令的格式為:
TEQ{條件}運算元1,運算元2
TEQ指令的功能為:
TEQ指令用於把一個暫存器的內容和另一個暫存器的內容或常數進行按
位XOR運算,並根據運算結果更新CPSR中條件旗標位元的值。該指令通常用
於比較運算元1和運算元2是否相等。
TEQ的作用與TST類似,區別是執行的計算是XOR,而不是AND。該指
令提供了一種查看兩個運算元是否相同,而又不影響進位元旗標的方法。加上P
尾碼的TEQ指令還可用於改變R15中的旗標(在26-bit模式中)。TEQ指令設置S
位元。
指令示例:
TEQ
R1, R2 ;將暫存器R1的值與暫存器R2的值按位元XOR,
並根據結果設置CPSR的旗標位元
旗標位元:
在結果中設置N和Z旗標,如果使用移位元定址方式,則從它得到C旗標
,不影響V旗標
使用AXD執行TST指令產生的結果,如下圖6-7所示,在執行前的CPSR
的值是0x000000D3,將暫存器R1的值與R2依序做XOR邏輯運算,當執行完
後,會根據結果來設定CPSR的條件旗標位元,所以值被改變如下
0x800000D3。
執行TEQ前
執行TEQ後
圖6-7執行TEQ指令結果示意圖

6. ADD指令
ADD指令的格式為:
ADD{條件}{S}目的暫存器,運算元1,運算元2
ADD指令的功能為:
ADD指令用於把兩個運算元相加,並將結果存放到目的暫存器中。運算元1
應是一個暫存器,運算元2可以是一個暫存器、被移位的暫存器或一個常數。
指令示例:
ADD
R0, R1, R2
;R0=R1+R2
ADD
R0, R1, #256
;R0=R1+256
ADD
R0, R2, R3, LSL#1
;R0=R2+(R3<<1)
旗標位元:
如果指令中使用S位元,指令執行結束則設置N和Z位,並從ALU獲取C和V旗
標。
使用AXD執行ADD指令產生的結果,如下圖6-8所示,在執行前,R0暫存器
的值0x0000000F,執行第6行執行,將R0暫存器的值加上0xF0放到R1的暫存
器,所以執行完結果如下圖6-8執行後R1的暫存器的值為0x000000FF。
執行ADD前
執行ADD後
圖6-8執行ADD指令結果示意圖

7. ADC指令
ADC指令的格式為:
ADC{條件}{S}目的暫存器,運算元1,運算元2
ADC指令的功能為:
ADC指令用於把兩個運算元相加,再加上CPSR中的C條件旗標位元的值,
並將結果存放到目的暫存器中。它使用一個進位元旗標位元,這樣就可以做比
32位大的數的加法,注意,不要忘記設置S尾碼來更改進位元旗標。運算元1應
是一個暫存器,運算元2可以是一個暫存器、被移位的暫存器或一個常數。
以下指令序列完成兩個128位數的加法,第一個數由高到低存放在暫存器R7
~R4,第二個數由高到低存放在暫存器Rll~R8,運算結果由高到低存放在暫存
器R3~R0。
ADDS R0, R4, R8
ADCS R1, R5, R9
ADCS R2, R6, R10
ADC R3, R7, R11
; 加低端的字
; 加第二個字,帶進位
; 加第三個字,帶進位
; 加第四個字,帶進位
旗標位元:
如果指令中使用S位元,指令執行結束則設置N和Z位,並從ALU獲取C和V旗
標。
使用AXD執行ADCS指令產生的結果,如下圖6-9所示,設置R0的值為
0xFFFFFFFF,當執行ADCS第6行指令時,會將R0加上0xF0的值放到R1的位置
,R1暫存器值改改為0x000000EF,CPSR的C旗標位的位元值,如下圖6-89所示
,為0x200000D3。
執行ADCS前
執行ADCS後
執行ADCS後
圖6-9執行ADD指令結果示意圖

8.
SUB指令
SUB指令的格式為:
SUB{條件}{S}目的暫存器,運算元1,運算元2
SUB指令的功能為:
SUB指令用於把運算元1減去運算元2,並將結果存放到目的暫存器中。運
算元1應是一個暫存器,運算元2可以是一個暫存器、被移位的暫存器或一個常
數。該指令可用於有符號數或無符號數的減法運算。
指令示例:
SUB
SUB
SUB
標。
R0, R1, R2
R0, R1, #256
R0, R2, R3, LSL#1
;R0=R1-R2
;R0=R1-256
;R0=R2-(R3<<1)
旗標位元:
如果指令中使用S位元,指令執行結束則設置N和Z位,從ALU獲取C和V旗
使用AXD執行SUB指令產生的結果,如下圖6-10所示,執行前R0的暫存值
的為0xFFFFFFFF,當執行第6行SUB的指令時,會將R0的值減去0XF0的數值
,然後存放到R1的暫存器,執行SUB後,如下圖6-10執行後,R1暫存器的值為
0XFFFFFF0F。
執行SUB前
執行SUB後
圖6-10 執行SUB指令結果示意圖
 9、SBC指令
SBC指令的格式為:
SBC{條件}{S}目的暫存器,運算元1,運算元2
SBC指令的功能為:
SBC指令用於把運算元l減去運算元2,再減去CPSR中的C條件旗標位元的反
碼,並將結果存放到目的暫存器中。運算元1應是一個暫存器,運算元2可以是一
個暫存器、被移位的暫存器或一個常數。該指令使用進位元旗標來表示借位,這
樣就可以做大於32位的減法,注意,不要忘記設置S尾碼來更改進位元旗標。該
指令可用於有符號數或無符號數的減法運算。
指令示例:
SUBS R0, R1, R2
標。
;R0=R1.R2.!C,並根據結果設置CPSR的進位元旗
旗標位元:
如果指令中使用S位元,指令執行結束則設置N和Z位,從ALU獲取C和V
旗標。
使用AXD執行SBCS指令產生的結果,如下圖6-11所示,執行前R0的暫存
器為0x1234FFFF,設置CPSR的C旗標為1,然後執行SBCS第六行程式時,會
將R0的暫存器值0x1234FFFF減去0xFFFFFFFF再減去C旗標位元的反值,並
將結果存在R1中,執行結果如下圖6-11執行後所示,R1暫存器為0x12350000
。
設定CPSR的C旗標為1
執行SBCS前
執行SBCS後
圖6-11執行SBCS指令結果示意圖
 10、 RSB指令
RSB指令的格式為:
RSB{條件}{S}目的暫存器,運算元1,運算元2
RSB指令的功能為:
RSB指令稱為逆向減法指令,用於把運算元2減去運算元1,並將結果存放到目
的暫存器中。運算元1應是一個暫存器,運算元2可以是一個暫存器、被移位的暫存器
或一個常數。該指令可用於有符號數或無符號數的減法運算。
指令示例:
RSB
R0, R1, R2
RSB
R0, R1, #256
RSB
R0, R2, R3, LSL#1
;R0=R2-R1
;R0=256-R
;R0=(R3<<1)-R2
旗標位元:
如果指令中使用S位元,指令執行結束則設置N和Z位,從ALU獲取C和V旗標。
使用AXD執行RSB指令產生的結果,如下圖6-12所示,R0暫存器的值為
0x00000002,執行第6行RSB程式後,會將#250的值減去R0的值,丟到R1的暫存器
中,而執行結果R1的暫存器的值即為0x000000F8。
執行RSB前
執行RSB後
圖6-12執行RSB指令結果示意圖
 11、
RSC指令
RSC指令的格式為:
RSC{條件}{S}目的暫存器,運算元1,運算元2
RSC指令的功能為:
RSC指令用於把運算元2減去運算元1,再減去CPSR中的C條件旗標位元
的反碼,並將結果存放到目的暫存器中。運算元1應是一個暫存器,運算元2可以
是一個暫存器、被移位的暫存器或一個常數。該指令使用進位元旗標來表示借位
,這樣就可以做大於32位的減法,注意,不要忘記設置S尾碼來更改進位元旗標
。該指令可用於有符號數或無符號數的減法運算。
指令示例:
RSC
R0, Rl, R2
;R0=R2-R1-!C
旗標位元:
如果設置S位元,指令執行結束則設置N和Z位,從ALU獲取C和V旗標。
使用AXD執行RSCS指令產生的結果,如下圖6-13所示,R0暫存器的值為
I0x000000FF,執行第6行程式時,#0數值會減去R0,再減去CPRS中的C旗標位
元的反值,在儲存於R1的暫存器中,執行後R1的值為0XFFFFFF00,RSCS的N
就表示借示的值。
執行RSCS前
執行RSCS後
執行RSCS後
圖6-13 執行RSCS指令結果示意圖
 13、
AND指令
AND指令的格式為:
AND{條件}{S}目的暫存器,運算元1,運算元2
AND指令的功能為:
AND指令用於在兩個運算元上進行邏輯與運算,並把結果存放到目的暫存
器中。運算元1應是一個暫存器,運算元2可以是一個暫存器、被移位的暫存器或
一個常數。該指令常用於遮罩運算元1的某些位。
指令示例:
AND
R0, R0, #3
;該指令保持R0的位元0、1,其餘位清為零
旗標位元:
如果指令中使用S位元,指令執行結束則更改N和Z位元,C旗標位元從使用
的移位器中得到,不影響V旗標。
使用AXD執行指令AND產生的結果,如下圖6-14所示,執行前R0暫存器為
0x000000FF,執行第6行程式時,R0與#3做AND的邏輯運算,執行後將資料儲存
在R0,所以暫存器R0的值為執行後的結果為0x00000003。
執行AND前
執行AND後
圖6-14執行AND指令結果示意圖
 13、 ORR指令
ORR指令的格式為:
ORR{條件}{S}目的暫存器,運算元1,運算元2
ORR指令的功能為:
ORR指令用於在兩個運算元上進行邏輯或運算,並把結果存放到目的暫存
器中。運算元l應是一個暫存器,運算元2可以是一個暫存器、被移位的暫存器或
一個常數。該指令常用於設置運算元1的某些位。
變
指令示例:
ORR
R0, R0, #3
;該指令設置R0的位元0、1,其餘位保持不
旗標位元:
如果指令中使用S位元,指令執行結束則更改N和Z位元,C旗標位元從使用
的移位器中得到,不影響V旗標。
使用AXD執行指令ORR產生的結果,如下圖6-15所示,執行前R0暫存器的值
0x000000FF,執行第6行ORR指令時,R0與#0x300做OR的邏輯運算,並將執行
結果回傳儲存於R0暫存器中,執行後 R0暫存器的值為0x000003FF。
執行ORR前
執行ORR後
圖6-15執行ORR指令結果示意圖
 14、 EOR指令
EOR指令的格式為:
EOR{條件}{S}目的暫存器,運算元1,運算元2
EOR指令的功能為:
EOR指令用於在兩個運算元上進行邏輯XOR運算,並把結果存放到目的暫存
器中。運算元1應是一個暫存器,運算元2可以是一個暫存器、被移位的暫存器或一
個常數。該指令常用於反轉運算元1的某些位。
變
指令示例:
EOR
R0, R0, #3
;該指令反轉R0的0、1位元,其餘位元保持不
旗標位元:
如果指令中使用S位元,指令執行結束則更改N和Z位元,C旗標位元從使用的
移位器中得到,不影響V旗標。
使用AXD執行指令EOR產生的結果,如下圖6-16所示,執行前R0暫存器的值
0x000000FF,執行第6行EOR指令時,R0與#3進行XOR的邏輯運算,並將執行結
果回傳儲存於R0暫存器中,執行後 R0暫存器的值為0x000000F
執行EOR前
執行EOR後
圖6-16執行EOR指令結果示意圖
 15、 BIC指令
BIC指令的格式為:
BIC{條件}{S}目的暫存器,運算元1,運算元2
BIC指令的功能為:
BIC指令用於清除運算元1的某些位元,並把結果存放到目的暫存器中。運算元
1應是一個暫存器,運算元2可以是一個暫存器、被移位的暫存器或一個常數。運算
元2為32位元的遮罩,如果在遮罩中設置了某一位元,則清除這一位元。未設置的遮
罩位元保持不變。
指令示例:
BIC
R0, R0, #0xb
其餘的位元保持不變。
;該指令清除R0中的位,元0、位元1和位元3,
旗標位元:
如果指令中使用S位元,指令執行結束則更改N和Z位元,C旗標位元從使用的
移位器中得到,不影響V旗標。
使用AXD執行指令BIC產生的結果,如下圖6-17所示,執行前R0暫存器的值
0x000000FF,執行第6行BIC指令時,#0x55等於01010101,而R0的值11111111,
會清除bit0、bit2、bit4、bit8的值,然後儲存到R0的暫存器中,執行結果R0暫存器
的值為0x000000FF。
執行BIC前
執行BIC後
圖6-17執行BIC指令結果示意圖
 6-3 乘法指令與乘加指令:
 ARM微處理器支援的乘法指令與乘加指令共有6條,可分為運算結果為32位和運算
結果為64位兩類,與前面的資料處理指令不同,指令中的所有運算元、目的暫存器
必須為通用暫存器,不能對運算元使用立即常數或被移位的暫存器,同時,目的暫
存器和運算元1必須是不同的暫存器。
乘法指令與乘加指令共有以下6條:
MUL
MLA
SMULL
SMLAL
UMULL
UMLAL
32位元乘法指令
32位元乘加指令
64位元有符號數乘法指令
64位元有符號數乘加指令
64位元無符號數乘法指令
64位元無符號數乘加指令

1.
MUL指令
MUL指令的格式為:
MUL{條件}{S}目的暫存器,運算元1,運算元2
MUL指令的功能為:
MUL指令完成將運算元1與運算元2的乘法運算,並把結果存放到目的暫存器
中,同時可以根據運算結果設置CPSR中相應的條件旗標位元。其中,運算元1和
運算元2均為32位元的有符號數或無符號數。
指令示例:
MUL
R0, R1, R2
MULS
R0, R1, R2
標位元。
;R0=R1×R2
;R0=R1×R2,同時設置CPSR中的相關條件旗
旗標位元:
如果設置S位元,則在結果中設置N和Z旗標,未定義C旗標,不影響V旗標。
使用AXD執行指令MUL產生的結果,如下圖6-18所示,執行前R2暫存器的值
0x00000040,執行第7行MUL指令時,會將R1暫存器值0x00000020乘上R2暫存
器的值0x00000040,執行後的結果儲存在R0的暫存器,所以R0暫存器的值為
0x00000800。
圖6-18執行BIC指令結果示意圖

2.
MLA指令
MLA指令的格式為:
MLA{條件}{S}目的暫存器,運算元1,運算元2,運算元3
MLA指令的功能為:
MLA指令完成將運算元1與運算元2的乘法運算,再將乘積加上運算元3,並
把結果存放到目的暫存器中,同時可以根據運算結果設置CPSR中相應的條件旗
標位元。其中,運算元1和運算元2均為32位元的有符號數或無符號數。
條
。
指令示例:
MLA
R0, Rl, R2, R3
MLAS
R0, R1, R2, R3
件旗標位元
R0=R1×R2+R3
;R0=R1×R2+R3,同時設置CPSR中的相關
旗標位元:
如果設置S位元,則在結果中設置N和Z旗標,未定義C旗標,不影響V旗標
使用AXD執行指令MLA產生的結果,如下圖6-19所示,執行前R1暫存器的
0x00000002,R2暫存器0x00000002,R3暫存器0x00000003,執行第8行MLA
指令時,會將R1暫存器值0x00000002乘上R2暫存器的值0x00000004加上R3
0x00000003,執行後的結果儲存在R0的暫存器,所以R0暫存器的值為
0x00000011。
MLA執行前
MLA執行後
圖6-19執行MLA指令結果示意圖

3. SMULL指令
SMULL指令的格式為:
SMULL{條件}{S}目的暫存器Low,目的暫存器High,運算元1,運算元2;
SMULL指令的功能為:
SMULL指令完成將運算元1與運算元2的乘法運算,並把結果的低32位元放置到
目的暫存器Low中,結果的高32位元放置到目的暫存器High中,同時可以根據運算
結果設置CPSR中相應的條件旗標位元。其中,運算元l和運算元2均為32位元的有
符號數。
指令示例:
SMULL R0, R1, R2, R3
位元
;R0=(R2×R3)的低32位元;R1=(R2×R3)的高32
旗標位元:
如果設置S位元,則在結果中設置N和Z旗標,未定義C旗標,不影響V旗標。
使用AXD執行指令SMULL產生的結果,如下圖6-20所示,執行前R3暫存器的
值0x00042000,R4暫存器的值0x00020000,執行第8行SMULL指令時,會將R3
暫存器值0x00042000乘上R4暫存器的值0x00020000,低32位元的值存在R0,所
以執行後R0暫存器的結果0x40000000,高32位元的值存在R1暫存器中,R1暫存
器的值為0x00000008。
SMULL執行前
SMULL執行後
圖6-20執行SMULL指令結果示意圖

4. SMLAL指令
SMLAL指令的格式為:
SMLAL{條件}{S}目的暫存器Low,目的暫存器High,運算元1,運算元2;
SMLAL指令的功能為:
SMLAL指令完成將運算元1與運算元2的乘法運算,並把結果的低32位元同目
的暫存器Low中的值相加後又存放到目的暫存器Low中,結果的高32位元同目的
暫存器High中的值相加後又存放到目的暫存器High中,同時可以根據運算結果設
置CPSR中相應的條件旗標位元。其中,運算元1和運算元2均為32位元的有符號
數。
對於目的暫存器Low,在指令執行前存放64位元加數的低32位元,指令執行後
存放結果的低32位元。
對於目的暫存器High,在指令執行前存放64位元加數的高32位元,指令執行
後存放結果的高32位元。
指令示例:
SMLAL R0, R1, R2, R3
R1=(R2xR3)的高32位元+R1
;R0=(R2xR3)的低32位元+R0;
旗標位元:
如果設置S位元,則在結果中設置N和Z旗標,未定義C旗標,不影響V旗
標。
使用AXD執行指令SMLAL產生的結果,如下圖6-21所示,執行前R0暫存
器值0x00000001,R1暫存器的值0x00000001,R3暫存器值0x00042000,R4
暫存器值0x00020000,執行第8行SMLAL指令時,會將R3暫存器值
0x00042000乘上R4暫存器的值0x00020000加上R0暫存器的值0x00000001,
並將低32位元的值存在R0,所以執行後R0暫存器的結果0x40000001,高32位
元的值加上原本R1暫存器裡面的值0x00000001,所以執行後R1暫存器的值為
0x00000009。
SMLAL執行前
SMLAL執行後
圖6-21執行SMLAL指令結果示意圖

5.
UMULL指令
UMULL指令的格式為:
UMULL{條件}{S}目的暫存器Low,目的暫存器High,運算元1,運算元2;
UMULL指令的功能為:
UMULL指令完成將運算元1與運算元2的乘法運算,並把結果的低32位元
放置到目的暫存器Low中,結果的高32位元放置到目的暫存器High中,同時可
以根據運算結果設置CPSR中相應的條件旗標位元。其中,運算元1和運算元2
均為32位元的無符號數。
指令示例:
UMULL R0, R1, R2, R3
高32位元
標。
;R0=(R2×R3)的低32位元;R1=(R2×R3)的
旗標位元:
如果設置S位元,則在結果中設置N和Z旗標,未定義C旗標,不影響V旗
使用AXD執行指令UMULL產生的結果,如下圖6-22所示,執行前R3暫存
器的值0x00042000,R4暫存器的值0x00020000,執行第8行UMULL指令時,
會將R3暫存器值0x00042000乘上R4暫存器的值0x00020000,低32位元的值存
在R0,所以執行後R0暫存器的結果0x40000000,高32位元的值存在R1暫存器
中,R1暫存器的值為0x00000008。
圖6-22執行UMULL指令結果示意圖

6. UMLAL指令
UMLAL指令的格式為:
UMLAL{條件}{S}目的暫存器Low,目的暫存器High,運算元1,運算元2;
UMLAL指令的功能為:
UMLAL指令完成將運算元1與運算元2的乘法運算,並把結果的低32位元同
目的暫存器Low中的值相加後又放置到目的暫存器Low中,結果的高32位元同
目的暫存器Hjgh中的值相加後又放置到目的暫存器High中,同時可以根據運算
結果設置CPSR中相應的條件旗標位元。其中,運算元1和運算元2均為32位元
的無符號數。
對於目的暫存器Low,在指令執行前存放64位元加數的低32位元,指令執行
後存放結果的低32位元。
對於目的暫存器High,在指令執行前存放64位元加數的高32位元,指令執行
後存放結果的高32位元。
指令示例:
UMLAL R0, R1, R2, R3
R1=(R2×R3)的高32位元+R1
;R0=(R2 xR3)的低32位元+R0;
旗標位元:
如果設置S位元,則在結果中設置N和Z旗標,未定義C旗標,不影響V旗標。
使用AXD執行指令UMLAL產生的結果,如下圖6-23所示,執行前R0暫存器
值0x00000001,R1暫存器的值0x00000001,R3暫存器值0x00042000,R4暫存
器值0x00020000,執行第8行SMLAL指令時,會將R3暫存器值0x00042000乘上
R4暫存器的值0x00020000加上R0暫存器的值0x00000001,並將低32位元的值存
在R0,所以執行後R0暫存器的結果0x40000001,高32位元的值加上原本R1暫存
器裡面的值0x00000001,所以執行後R1暫存器的值為0x00000009。
UMLAL執行前
UMLAL執行後
圖6-23執行UMLAL指令結果示意圖
 6-4 程式狀態暫存器存取指令:
 ARM微處理器支援程式狀態暫存器存取指令,用於在程式狀態暫存器和通用暫存
器之間傳送資料,程式狀態暫存器存取指令包括以下兩條:
-MRS
-MSR
程式狀態暫存器到通用暫存器的資料傳送指令
通用暫存器到程式狀態暫存器的資料傳送指令
 1. MRS指令
 ARM微處理器支援程式狀態暫存器存取指令,用於在程式狀態暫存器和通用暫存
器之間傳送資料。程式狀態暫存器存取指令包括以下兩條:
 MRS,程式狀態暫存器到通用暫存器的資料傳送指令;
 MSR,通用暫存器到程式狀態暫存器的資料傳送指
 1)
MRS指令
MRS指令的格式為:
MRS{條件}通用暫存器,程式狀態暫存器(CPSR或SPSR)
MRS指令的功能為:
MRS指令用於將程式狀態暫存器的內容傳送到通用暫存器中。該指令一般用
在以下幾種情況:

當需要改變程式狀態暫存器的內容時,可用MRS將程式狀態暫存器的內容讀入
通用暫存器,修改後再寫回程式狀態暫存器。

當在異常處理或進程切換時,需要保存儲存程式狀態暫存器的值,可先用該指令
讀出程式狀態暫存器的值,然後保存儲存。
指令示例:
MRS R0, CPSR
;傳送CPSR的內容到R0
MRS R0, SPSR
;傳送SPSR的內容到R0
使用AXD執行指令MRS產生的結果,如下圖6-24所示,執行前CPSR內容
0x000000D3,執行第5行指令後,將CPSR裡面的值傳送到R0暫存器中,所以執
行完後R0暫存器的值為0x000000D3。
執行MRS前,CPSR內容
執行MRS後
圖6-24執行MRS指令結果示意圖

2. MSR指令
MSR指令的格式為:
MSR{條件}程式狀態暫存器(CPSR或SPSR)_<域>,運算元
MSR指令的功能為:
MSR指令用於將運算元的內容傳送到程式狀態暫存器的特定域中。其中,
運算元可以為通用暫存器或常數;<域>用於設置程式狀態暫存器中需要操作的
位元。32位元的程式狀態暫存器可分為4個域:




位元[31:24]為條件旗標位元區域,用F表示;
位元[23:16]為狀態位元區域,用S表示;
位元[15:8]為擴充位域,用X表示;
位元[7:0]為控制位元區域,用C表示。
該指令通常用於恢復或改變程式狀態暫存器的內容,在使用時,一般要在MSR
指令中指明將要操作的域。
指令示例:
MSR
CPSR, R0
;傳送R0的內容到CPSR;
MSR
SPSR, R0
;傳送R0的內容到SPSR;
MSR
CPSR_C, R0;傳送R0的內容到SPSR,但僅僅修改CPSR中的
控制位元區域。
MSR指令通常與MRS指令聯合使用,透過對CPSR、SPSR的修改,實現處
理器的模式切換,設置/禁止IRQ。
設置IRQ中斷示例:
MRS
R1, CPSR
BIC
Rl, R1, #0x80
MSR
CPSR_C, R1
使用AXD執行指令MSR產生的結果,如下圖6-25所示,執行前CPSR內容
0x000000D3,R1暫存器的值0x00000000,執行第6行指令後,將R1暫存器的值
傳送到CPSR裡面中,所以執行完後CPSR裡面的值為0x00000000。
執行MSR前,CPSR內容
執行MSR後,CPSR內容
圖6-25執行MSR指令結果示意圖
 6-5 載入/儲存指令:
 ARM微處理器支援載入/儲存指令用於在暫存器和記憶體之間傳送資料,載入指
令用於將記憶體中的資料傳送到暫存器,儲存指令則完成相反的操作。常用的載
入/儲存指令如下:
 LDR,字資料載入指令;
 LDRB,位元組資料載入指令;
 LDRH,半字資料載入指令;
 STR,字資料儲存指令;
 STRB,位元組資料儲存指令;
 STRH,半字資料儲存指令。
 1)
LDR(LoaD Register a word)指令
LDR指令的格式為:
LDR{條件}目的暫存器,<記憶體位址>
LDR指令的功能為:
LDR指令用於從記憶體中將一個32位元的字資料傳送到目的暫存器中。該指
令通常用於從記憶體中讀取32位元的字資料到通用暫存器,然後對資料進行處理
。當程式計數器PC作為目的暫存器時,指令從記憶體中讀取的字資料被當作目的
地址,從而可以實現程式流程的跳轉。該指令在程式設計中比較常用,且定址方式
靈活多樣,請讀者認真掌握。
指令示例:
LDR
R0, [R1]
LDR
R0, [R1, R2]
;將記憶體位址為R1的字資料讀入暫存器R0
;將記憶體位址為RI+R2的字資料讀入暫存器R0
LDR
R0, [R1, #8]
;將記憶體位址為Rl+8的字資料讀入暫存器R0
LDR
R0, [R1, R2]! ;將記憶體位址為RI+R2的字資料讀入暫存器
R0,並將新位址
LDR
R1+R2寫入R1
R0, [R1, #8]! ;將記憶體位址為Rl+8的字資料讀入暫存器
R0,並將新位址R1+8寫入R1
LDR
R0, [R1], R2 ;將記憶體位址為R1的字資料讀入暫存器
R0,並將新位址R1+R2寫入R1
LDR
R0, [R1, R2, LSL#2]!
;將記憶體位址為R1+R2×4的字資料讀入暫存器
R0, 並將新位址Rl+R2×4寫入R1
LDR
R0, [R1], R2, LSL#2
;將記憶體位址為R1的字資料讀入暫存器
R0,並將新位址Rl+R2×4寫入R1
 2)
LDRB(LoaD Register a Byte)指令
LDRB指令的格式為:
LDR{條件}B目的暫存器,<記憶體位址>
LDRB指令的功能為:
LDRB指令用於從記憶體中將一個8位元的位元組資料傳送到目的暫存器中,
同時將暫存器的高24位元清為零。該指令通常用於從記憶體中讀取8位元的位元組
資料到通用暫存器,然後對資料進行處理。當程式計數器PC作為目的暫存器時,
指令從記憶體中讀取的字資料被當作目的地址,從而可以實現程式流程的跳轉。
指令示例:
LDRB
R0, [R1] ;將記憶體位址為R1的位元組資料讀入暫存器R0,並將
R0的高24位元清為零
LDRB
R0, [R1, #8] ;將記憶體位址為Rl+8的位元組資料讀入暫存器R0,
並將R0的高24位元清為零
 3)
LDRH(Load Register Halfword)指令
LDRH指令的格式為:
LDR{條件}H目的暫存器,<記憶體位址>
LDRH指令的功能為:
LDRH指令用於從記憶體中將一個16位元的半字資料傳送到目的暫存器中,
同時將暫存器的高16位元清為零。該指令通常用於從記憶體中讀取16位元的半字
資料到通用暫存器,然後對資料進行處理。當程式計數器PC作為目的暫存器時
,指令從記憶體中讀取的字資料被當作目的地址,從而可以實現程式流程的跳轉
。
指令示例:
LDRH
R0, [R1]
; 將記憶體位址為Rl的半字資料讀入暫存器R0,
並將R0的高16位清為零
LDRH
R0, [Rl, #8] ;將記憶體位址為Rl+8的半字資料讀入暫存器R0
,並將R0的高16位清為零
LDRH
R0, [R1, R2] ;將記憶體位址為RI+R2的半字資料讀入暫存器
R0,並將R0的高16位元清為零
上列眾多的範例中,挑選LDR R0, [R1, R2, LSL#2], 使用AXD執行指令
LDR產生的結果,如下圖6-26所示,執行前的畫面,將R1和R2分別設定
0x8000及0x1,由上述指令範例說明我們得此指令會將位址R1+R2×4資料讀入
R0,並更新R1,因為R2是0x1乘以4後得到0x4再和R1相加得到0x8004,再將
記憶體中0x8004的內容拷貝到R0,如圖?6-?26執行後畫面,您會發現其值為
0xE3A00018,若要觀察此數值可以打開記憶體視窗,並輸入0x8000位址後,
您就可以看到從0x8004到0x8007的記憶體內容,依順排列為0x18、0x00、
0xA0、和0xE3。
執行LDR前
執行LDR後
圖6-26執行LDR指令結果示意圖
4)
STR(STore Register word)指令
STR指令的格式為:
STR{條件}來源暫存器,<記憶體位址>
STR指令的功能為:
STR指令用於從來源暫存器中將一個32位元的字資料傳送到指定記憶體中。
該指令在程式設計中比較常用,且定址方式靈活多樣,使用方式可參考指令
LDR。
指令示例:
STR
R0, [R1], #8 ;將R0中的字資料寫入以R1為位址的記憶體中,
並將新位址Rl+8寫入Rl
STR
R0, [ R1, #8] ;將R0中的字資料寫入以Rl+8為位址的記憶體中
 5)
STRB(STore Register Byte)指令
STRB指令的格式為:
STR{條件}B來源暫存器,<記憶體位址>
STRB指令的功能為:
STRB指令用於從來源暫存器中將一個8位元的位元組資料傳送到指定記憶
體中。該位元組資料為來源暫存器中的低8位元。
指令示例:
STRB
R0, [R1] ;將暫存器R0中的位元組資料寫入以R1為位址的記憶
體中
STRB
R0, [R1, #8] ;將暫存器R0中的位元組資料寫入以Rl+8為位址的
記憶體中
 6)
STRH(STore Register Halfword)指令
STRH指令的格式為:
STR{條件}H來源暫存器,<記憶體位址>
STRH指令的功能為:
STRH指令用於從來源暫存器中將一個16位元的半字資料傳送到指定記憶體
中。該半字資料為來源暫存器中的低16位元。
指令示例:
STRH
R0, [R1] ;將暫存器R0中的半字資料寫入以R1為位址的記憶體
中
STRH
憶體中
R0, [R1, #8] ;將暫存器R0中的半字資料寫入以Rl+8為位址的記
上列眾多的範例中,使用AXD執行指令STR產生的結果,如下圖6-27所示
,執行前記憶體位置0x00008030的值為7EFF0001,R1暫存器的值0x00000400
執行第7行STR的指令,將R1的值丟到R0的記憶體位置中,所以如執行後的圖
R0記憶體位置為00004000。
執行STR前
執行STR後
圖6-27執行STR指令結果示意圖
 6- 6 多重資料載入 / 儲存指令:
 ARM微處理器所支援的批量資料載入/儲存指令可以一次在一片連續的記憶體單
元和多個暫存器之間傳送資料。批量資料載入指令用於將一片連續的記憶體中的
資料傳送到多個暫存器,批量資料儲存指令則完成相反的操作。
 多暫存器載入和多暫存器儲存指令的作用主要是紀錄暫存器狀態、恢復現場、傳
遞參數等。在這些指令中也可以使用條件執行,要注意條件旗標要先於位元組旗
標表現。字裝載(LDR)或字儲存(STR)將生成一個字對齊的位址。暫存器列表放在
大括弧{}中,不管用什麼次序在其中指定暫存器,暫存器必須按從低到高的編號
次序與從低端到高端的記憶體之間傳送資料。在指令編碼中,用一個單一的位元
來表示是否保存儲存一個暫存器,所以不能指定某個暫存器兩次。當使用一個範
圍內的暫存器時,可以簡單地只寫第一個和最後一個,並在其間加一個橫。例如
,R0-R3與R0、R1、R2、R3的作用相同。

常用的批量資料載入/儲存指令如下:
LDM,批量資料載入指令;

STM,批量資料儲存指令。
 1)
LDM(LoaD Multiple register)指令
LDM指令的格式為:
LDM{條件}{類型}基址暫存器{!},暫存器列表{}
LDM指令的功能為:
LDM指令用於從由基址暫存器所指示的一片連續記憶體到暫存器列表所指示
的多個暫存器之間傳送資料,當PC包括在列表的暫存器中時,指令讀到PC中的內
容作為程式跳轉的目標位址,實現跳轉操作。該指令的常見用途是將多個暫存器的
內容讀入或讀出。其中,{類型)為以下幾種情況:








IA,每次傳送後位址加1;
IB,每次傳送前位址加1;
DA,每次傳送後位址減1;
DB,每次傳送前位址減1;
FD,滿遞減堆疊;
ED,空遞減堆疊;
FA,滿遞增堆疊;
EA,空遞增堆疊。
{!} 為可選尾碼,若選用該尾碼,則當資料傳送完畢之後,將最後的位址寫
入基址暫存器,否則,基址暫存器的內容不改變。基址暫存器不允許為R15,暫
存器列表可以為R0~R15的任意組合。
{} 為可選尾碼,當指令為LDM且暫存器列表中包含R15時,選用該尾碼則表
示:除了正常的資料傳送之外,還將SPSR複製到CPSR。同時,該尾碼還表示傳
入或傳出的是用戶模式下的暫存器,而不是當前模式下的暫存器。
指令示例:
STMFD
R13!, {R0, R4-R12, LR} ;將暫存器列表中的暫存器(R0,R4到
R12,LR)存入堆疊
LDMFD R13!, {R0, R4-R12, PC} ;將堆疊內容恢復到暫存器(R0,R4到R12
,LR)
使用AXD執行指令STMFD產生的結果,如下圖6-28所示,執行前R0暫存器
0x00000020、R4暫存器0x00000040、R12暫存器0x00000060,執行第9行時,
將R0暫存器的值,及R4至R12暫存器的值存入堆疊R13的暫存器中,所以R13暫
存器的值就為0XFFFFFFD4,如執行後的圖所示。
圖6-28執行STMFD指令結果示意圖
 使用AXD執行指令LDMFD產生的結果,如下圖6-29所示,執行前R0暫存器
0x00000000、R4暫存器0x00000000、R12暫存器0x00000000,R13暫存器的
值就為0XFFFFFFD4,執行第13行後,R13暫存器的值0XFFFFFFD4,會丟回
R0、R4至R12暫存器,所以R0的值0x0000020,R4暫存器的值0x00000040、
R12暫存器的值0x00000060,如執行後如下圖6-28所示。
圖6-29執行LDMFD指令結果示意圖
 6-7 資料交換指令:
 ARM微處理器所支援的資料交換指令能在記憶體和暫存器之間交換資料。資料交換
指令如下:
SWP,字組字組資料交換指令;
SWPB,位元組資料交換指令。
 1) SWP指令
SWP指令的格式為:
SWP{條件}目的暫存器,來源暫存器1,[來源暫存器2]
SWP指令的功能為:
SWP指令用於將來源暫存器2所指向的記憶體中的字資料傳送到目的暫存器中,
同時將來源暫存器1中的字資料傳送到來源暫存器2所指向的記憶體中。顯然,當來源
暫存器1和目的暫存器為同一個暫存器時,指令交換該暫存器和記憶體的內容。
指令示例:
SWP R0, R1, [R2] ; 將R2所指向的記憶體中的字資料傳送到R0;同時將R1中
的字資料傳送到R2所指向的儲存單元
SWP R0, R0, [R1] ; 該指令完成將R1所指向的記憶體中的字資料與R0中的字資
料交換
 2)
SWPB指令
SWPB指令的格式為:
SWPB{條件)B目的暫存器,來源暫存器1[來源暫存器2]
SWPB指令的功能為:
SWPB指令用於將來源暫存器2所指向的記憶體中的位元組資料傳送到目的暫存
器中,目的暫存器的高24位元清為零,同時將來源暫存器1中的位元組資料傳送到來
源暫存器2所指向的記憶體中。顯然,當來源暫存器1和目的暫存器為同一個暫存器
時,指令交換該暫存器和記憶體的內容。
指令示例:
SWPB R0, R1, [R2] ;將R2所指向的記憶體中的位元組資料傳送到R0,R0的
高24位清為零;同時將R1中的低8位元資料傳送到R2所指向的儲存單元;
SWPB R0, R0, [Rl] ; 將Rl所指向的記憶體中的位元組資料與R0中的低8位元
資料交換。
使用AXD執行指令SWP產生的結果,如下圖6-30所示,R0所指向的記憶體位置
,0x00008030,將R1暫存器的值0x5500丟到R0記憶體的位址上,執行第9行SWP
程式指令時,將R0的記憶體位址的值與R2暫存器的值做交換,所以R2暫存器的值
被改變為0x00005500,而 R0的記憶體位址變成了00000000。
執行SWP前
執行SWP後
圖6-30執行SWP指令結果示意圖
 6-8 移位元指令(操作)
 ARM微處理器內嵌的桶型移位器(Barrel Shifter)支援資料的各種移位元操作,移位
元操作在ARM指令集中不作為單獨的指令使用,它只能作為指令格式中的一個欄
位,在組合語言中表示為指令中的選項。例如,資料處理指令的第二個運算元為暫
存器時,就可以加入移位元操作選項對它進行各種移位操作。移位操作包括如下6
種類型,其中ASL和LSL是等價的,可以自由互換。
 LSL,邏輯左移;
 ASL,算術左移;
 LSR,邏輯右移;
 ASR,算術右移;
 ROR,迴圈右移;
 RRX,帶擴充的迴圈右移。
 1)
LSL(或ASL)操作
LSL(或ASL)操作的格式為:
通用暫存器,LSL(或ASL)運算元
LSL(或ASL)指令的功能為:
LSL(或ASL)可完成對通用暫存器中的內容進行邏輯(或算術)的左移操作,按
運算元所指定的數量向左移位,低位元用零來填充。其中,運算元可以是通用暫存
器,也可以是常數(0~31)。
操作示例:
MOV
R0, R1, LSL#2;將R1中的內容左移兩位元後傳送到R0中
使用AXD執行指令LSL產生的結果,如下圖6-31所示,R1暫存器的值為
0x00000000000000000000100000000000,執行第4行程式指令時,將R1暫存器
的值左移兩個位元,搬到R0的暫存器,R0暫存器執行後如圖6-30所示,R0的暫存
器的值為0x0000000000000000001000000000000。
執行LSL前
執行LSL後
圖6-31執行LSL指令結果示意圖
 2、 LSR操作
LSR操作的格式為:
通用暫存器,LSR 運算元
LSR可完成對通用暫存器中的內容進行右移的操作,按運算元所指定的數量
向右移位,左端用零來填充。其中,運算元可以是通用暫存器,也可以是立即常
數(0~31)。
操作範例:
MOV R0, R1, LSR#2
,左端用零來填充。
;將R1中的內容右移兩位元後傳送到R0中
使用AXD執行指令LSR產生的結果,如下圖6-32所示,R0暫存器的值為
0x00000000000000000000000000001000,執行第4行程式指令時,將R0暫存器
的值右移兩個位元,搬到R1的暫存器,R1暫存器執行後如下圖6-31所示,R1的
暫存器的值為0x0000000000000000000000000000010。
執行LSR前
執行LSR後
圖6-32執行LSR指令結果示意圖
 3、 ASR操作
ASR操作的格式為:
通用暫存器,ASR運算元
ASR指令的功能為:
ASR可完成對通用暫存器中的內容進行右移的操作,按運算元所指定的數量向右
移位,左端用第31位元的值來填充。其中,運算元可以是通用暫存器,也可以是常數
(0~31)。
操作示例:
MOV
R0, R1, ASR#2;將R1中的內容右移兩位元後傳送到R0中,左端用第
31位元的值來填充。
使用AXD執行指令ASR產生的結果,如下圖6-33所示,R0暫存器的值為
0x10100000000000000000000000000000,執行第4行程式指令時,將R0暫存器的值
右移兩個位元,搬到R1的暫存器,並將左端用31位元的值來填入,由於位移5個位元
,所以執行後如下圖所示,R1的暫存器的值為
0x1111110100000000000000000000000。
執行ASR前
執行ASR後
圖6-33執行ASR指令結果示意圖
 4、 ROR操作
ROR操作的格式為:
通用暫存器,ROR運算元
ROR指令的功能為:
ROR可完成對通用暫存器中的內容進行迴圈右移的操作,按運算元所指定的數量
向右迴圈移位,左端用右端移出的位元來填充。其中,運算元可以是通用暫存器,也
可以是常數(0~31)。顯然,當進行32位元的迴圈右移操作時,通用暫存器中的值不
改變。
操作示例:
MOV R0, R1, ROR#2 ;將R1中的內容迴圈右移兩位元後傳送到R0中。
使用AXD執行指令ROR產生的結果,如下圖6-34所示,R0暫存器的值為
0x00000000000000000000000000001011,執行第4行程式指令時,將R0暫存器的
值右移兩個位元,搬到R1的暫存器中,而R0所移動的underflow的兩個位元,會搬到
R1的第31位元、第30位元,所以執行後如下圖6-34所示,R1的暫存器的值為
0x1100000000000000000000000000010。
執行ROR前
執行ROR後
圖6-34執行ROR指令結果示意圖
 5、 RRX操作
RRX操作的格式為:
通用暫存器,RRX運算元
RRX指令的功能為:
RRX可完成對通用暫存器中的內容進行帶擴充的迴圈右移的操作,按運算元所
指定的數量向右迴圈移位,左端用進位元旗標位元C來填充。其中,運算元可以是通
用暫存器,也可以是常數(0~31)。
操作示例:
MOV R0, R1, RRX ;將R1中內容進行帶擴充的迴圈右移1個位後傳送到R0中。
使用AXD執行指令RRX產生的結果,如下圖6-35所示,R1暫存器的值為
0x00000000000000000000000000001000,執行第4行程式指令時,將R0暫存器的
值右移1個位元,搬到R0的暫存器中,而R1會移動1個位元,所以執行後如下圖6-35
所示,R0的暫存器的值為0x1100000000000000000000000000100,左端會用如果
有進位元旗標的話會由位元C來填充。
圖6-35執行RRX指令結果示意圖
 6-9 輔助運算器指令:
 ARM微處理器可支援多達16個輔助運算器,用於各種協處理操作。在程式執行過程
中,每個輔助運算器只執行針對自身的協處理指令,忽略ARM處理器和其他輔助運
算器的指令。

ARM的輔助運算器指令主要用於ARM處理器初始化,ARM輔助運算器的資料處理
操作,在ARM處理器的暫存器和輔助運算器的暫存器之間傳送資料,以及在ARM
輔助運算器的暫存器和記憶體之間傳送資料。ARM輔助運算器指令如下:





CDP,輔助運算器資料操作指令;
LDC,輔助運算器資料載入指令;
STC,輔助運算器資料儲存指令;
MCR,ARM處理器暫存器到輔助運算器暫存器的資料傳送指令;
MRC,輔助運算器暫存器到ARM處理器暫存器的資料傳送指令。
 1)
CDP指令
CDP指令的格式為:
CDP{條件}輔助運算器編碼,輔助運算器操作碼1,目的暫存器,來源暫存器
1,來源暫存器2,協處理器操作碼2
CDP指令的功能為:
CDP指令用於ARM處理器通知ARM輔助運算器執行特定的操作,若輔助運
算器不能成功完成特定的操作,則產生未定義指令異常。其中,輔助運算器操作
碼1和輔助運算器操作碼2為輔助運算器將要執行的操作,目的暫存器和來源暫存
器均為輔助運算器的暫存器,指令不涉及ARM處理器的暫存器和記憶體。
指令示例:
CDP P3, 2, C12, C10, C3, 4 ;該指令完成輔助運算器P3的初始化
 2)
LDC指令
LDC指令的格式為:
LDC{條件}{L}輔助運算器編碼,目的暫存器,[來源暫存器]
LDC指令的功能為:
LDC指令用於將來源暫存器所指向的記憶體中的字資料傳送到目的暫存器中,
若輔助運算器不能成功完成傳送操作,則產生未定義指令異常。其中,{L}選項表示
指令為長讀取操作,如用於雙精確度資料的傳輸。
指令示例:
LDC P3, C4, [R0] ;將ARM處理器的暫存器Ro所指向的記憶體中的字資料傳
送到輔助運算器P3的暫存器C4中
 3)
STC指令
STC指令的格式為:
STC{條件}{L}輔助運算器編碼,來源暫存器,[目的暫存器]
STC指令的功能為:
STC指令用於將來源暫存器中的字資料傳送到目的暫存器所指向的記憶體中
,若輔助運算器不能成功完成傳送操作,則產生未定義指令異常。其中,{L}選項
表示指令為長讀取操作,如用於雙精確度資料的傳輸。
指令示例:
STC P3, C4, [R0] ;將輔助運算器P3的暫存器C4中的字資料傳送到ARM處理
器的暫存器R0所指向的記憶體中
 4)
MCR指令
MCR指令的格式為:
MCR{條件}輔助運算器編碼,輔助運算器操作碼1,來源暫存器,目的暫存器
1,目的暫存器2,輔助運算器操作碼2
MCR指令的功能為:
MCR指令用於將ARM處理器暫存器中的資料傳送到輔助運算器暫存器中,若
輔助運算器不能成功完成操作,則產生未定義指令異常。其中,輔助運算器操作
碼1和輔助運算器操作碼2為輔助運算器將要執行的操作,來源暫存器為ARM處理
器的暫存器,目的暫存器1和目的暫存器2均為輔助運算器的暫存器。
指令示例:
MCR P3, 3, R0, C4, C5, 6
該指令將ARM處理器暫存器R0中的資料傳送到輔助運算器P3的暫存器C4和
C5中。
 5)
MRC指令
MRC指令的格式為:
MRC{條件}輔助運算器編碼,輔助運算器操作碼1,目的暫存器,來源暫存器
1,來源暫存器2,輔助運算器操作碼2
MRC指令的功能為:
MRC指令用於將輔助運算器暫存器中的資料傳送到ARM處理器暫存器中,若
輔助運算器不能成功完成操作,則產生未定義指令異常。其中,輔助運算器操作碼
1和輔助運算器操作碼2為輔助運算器將要執行的操作,目的暫存器為ARM處理器的
暫存器,來源暫存器1和來源暫存器2均為輔助運算器的暫存器。
指令示例:
MRC P3, 3, R0, C4, C5, 6
ARM處理器暫存器中
;該指令將輔助運算器P3的暫存器中的資料傳送到
 6-10 異常產生指令:
 ARM微處理器所支援的異常指令有如下兩條:
— SWI
軟體中斷指令
— BKPT
中斷點中斷指令
 1、 SWI指令
SWI指令的格式為:
SWI{條件} 24位的立即常數
SWI指令用於產生軟體中斷,以便用戶程式能調用作業系統的系統常式。作業系
統在SWI的異常處理程式中提供相應的系統服務,指令中24位元的立即常數指定用戶
程式調用系統常式的類型,相關參數透過通用暫存器傳遞,當指令中24位元的立即常
數被忽略時,用戶程式調用系統常式的類型由通用暫存器R0的內容決定,同時,參數
透過其他通用暫存器傳遞。
指令範例:
SWI
0x02
;該指令調用作業系統編號位元02的系統常式。
 2、 BKPT指令
BKPT指令的格式為:
BKPT
16位的立即常數
BKPT指令產生軟體中斷點中斷,可用於程式的除錯。
 6-11 ARM組譯器所支援的虛擬指令:
 在ARM組合語言程式裡,有一些特殊指令助記符,這些助記符與指令系統的助記
符不同,沒有相對應的操作碼,通常稱這些特殊指令助記符為虛擬指令,他們所完
成的操作稱為偽操作。虛擬指令在根源程式中的作用是為完成組合語言程式作各種
準備工作的,這些虛擬指令僅在編譯過程中起作用,一旦編譯結束,虛擬指令的使
命就完成。
 在ARM的組合語言程式中,有如下幾種虛擬指令:符號定義虛擬指令、資料定義
虛擬指令、編譯控制虛擬指令、巨集指令以及其他虛擬指令。
 6-11.1 符號定義(Symbol Definition)虛擬指令
 符號定義虛擬指令用於定義ARM組合語言程式中的變數、對變數設定值以及定義暫
存器的別名等操作。常見的符號定義虛擬指令有如下幾種:
 用於定義整體變數的GBLA、GBLL和GBLS。
 用於定義區域變數的LCLA、LCLL和LCLS。
 用於對變數設定值的SETA、SETL、SETS。
 為通用暫存器列表定義名稱的RLIST。
 1. GBLA、GBLL和GBLS
語法格式:
GBLA(GBLL或GBLS)
整體變數名
GBLA、GBLL和GBLS虛擬指令用於定義一個ARM程式中的整體變數,並將其
初始化。
其中:
GBLA虛擬指令用於定義一個全區的數位變數,並初始化為0;
GBLL虛擬指令用於定義一個全區的邏輯變數,並初始化為F(假);
GBLS虛擬指令用於定義一個全區的字串變數,並初始化為空;
由於以上三條虛擬指令用於定義整體變數,因此在整個程式範圍內變數名必須
唯一。
使用範例:
GBLA
Test1
Test1
SETA
GBLL
Test2
Test2
SETL
GBLS
Test3
Test3
SETS
LCLA、LCLL和LCLS
;定義一個全區的數位變數,變數名為Test1
0xaa
;將該變數設定值為0xaa
;定義一個全區的邏輯變數,變數名為Test2
{TRUE}
;將該變數設定值為真
;定義一個全區的字串變數,變數名為Test3
“Testing” ;將該變數設定值為“Testing”
語法格式:
LCLA(LCLL或LCLS) 區域變數名
LCLA、LCLL和LCLS虛擬指令用於定義一個ARM程式中的區域變數,並將其初
始化。
其中:
LCLA虛擬指令用於定義一個局部的數值變數,並初始化為0;
LCLL虛擬指令用於定義一個局部的邏輯變數,並初始化為F(假);
LCLS虛擬指令用於定義一個局部的字串變數,並初始化為空。
以上三條虛擬指令用於聲明區域變數,在其作用範圍內變數名必須唯一。
使用範例:
LCLA
Test4
Test4
SETA
LCLL
Test5
Test5
SETL
LCLS
Test6
Test6
SETS
SETA、SETL和SETS
;聲明一個局部的數值變數,變數名為Test4
0xaa
;將該變數設定值為0xaa
;聲明一個局部的邏輯變數,變數名為Test5
{TRUE} ;將該變數設定值為真
;定義一個局部的字串變數,變數名為Test6
“Testing” ;將該變數設定值為“Testing”
語法格式:
變數名
SETA(SETL或SETS)
運算式
虛擬指令SETA、SETL、SETS用於給一個已經定義的整體變數或區域變數設定值;
SETA虛擬指令用於給一個數值學變數設定值;
SETL虛擬指令用於給一個邏輯變數設定值;
SETS虛擬指令用於給一個字串變數設定值。
其中,變數名為已經定義過的整體變數或區域變數,運算式為將要賦給變數的值。
使用範例:
LCLA
Test3
LCLL
Test4
RLIST
Test3
SETA
Test4
SETL
;聲明一個局部的數值變數,變數Test3
0xaa
;將該變數設定值為0xaa
;聲明一個局部的邏輯變數,變數名為Test4
{TRUE} ;將該變數設定值為真
語法格式:
名稱
RLIST {暫存器列表}
RLIST虛擬指令可用於對一個通用暫存器列表定義名稱,使用該虛擬指令定義的名
稱可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的暫存器存取次序為
根據暫存器的編號由低到高,而與列表中的暫存器排列次序無關。
使用範例:
RegList
RLIST {R0-R5, R8, R10} ;將暫存器列表名稱定義為RegList;
可在ARM指令LDM/STM中透過; 該名稱
存取暫存器列表。
 6-11.2 資料定義(Data Definition)虛擬指令
 資料定義虛擬指令一般用於為特定的資料分配儲存單元,同時可完成已分配儲存單
元的初始化。常見的資料定義虛擬指令有如下幾種:









DCB
用於分配一個連續的位元組儲存單元並用指定的資料初始化。
DCW(DCWU) 用於分配一個連續的半字儲存單元並用指定的資料初始化。
DCD(DCDU)
用於分配一個連續的字儲存單元並用指定的資料初始化。
DCFD(DCFDU)用於為雙精確度的浮點數分配一個連續的字儲存單元並用指定
的資料初始化。
DCFS(DCFSU)用於為單精確度的浮點數分配一個連續的字儲存單元並用指定
的資料初始化。
DCQ(DCQU) 用於分配一個以8位元組為單位的連續的儲存單元並用指定的資料
初始化。
SPACE
用於分配一個連續的儲存單元
MAP
用於定義一個結構化的記憶體表首位址
FIELD
用於定義一個結構化的記憶體表的資料欄

1.

2. DCW(或DCWU)
語法格式:
標號
DCW(或DCWU)
運算式
DCW(或DCWU)虛擬指令用於分配一個連續的半字儲存單元並用虛擬指令中
指定的運算式初始化。其中,運算式可以為程式標號或數位運算式。
用DCW分配的字儲存單元是半字對齊的,而用DCWU分配的字儲存單元並不嚴
格要求半字對齊。
使用範例:
DataTest DCW
1, 2, 3
;分配一個連續的半字儲存單元並初始化。
DCB
語法格式:
標號
DCB
運算式
DCB虛擬指令用於分配一個連續的位元組儲存單元並用虛擬指令中指定的運算
式初始化。其中,運算式可以為0~255的數位或字串。DCB也可用“=”代替。
使用範例:
Str
DCB
“This is a test!” ;分配一個連續的位元組儲存單元並
初始化。

3.
DCD(或DCDU)
語法格式:
標號
DCD(或DCDU) 運算式
DCD(或DCDU)虛擬指令用於分配一個連續的字儲存單元並用虛擬指令
中指定的運算式初始化。其中,運算式可以為程式標號或數位運算式。DCD也
可用“&”代替。
用DCD分配的字儲存單元是字對齊的,而用DCDU分配的字儲存單元並不
嚴格要求字對齊。
使用範例:
DataTest DCD
4, 5, 6
;分配一個連續的字儲存單元並初始化。

4. DCFD(或DCFDU)
語法格式:
標號
DCFD(或DCFDU)
運算式
DCFD(或DCFDU)虛擬指令用於為雙精確度的浮點數分配一個連續的
字儲存單元並用虛擬指令中指定的運算式初始化。每個雙精確度的浮點數佔
據兩個字單元。
用DCFD分配的字儲存單元是字對齊的,而用DCFDU分配的字儲存單元
並不嚴格要求字對齊。
使用範例:
FDataTest
DCFD
2E115,-5E7
儲存單元並初始化為指定的雙精確度數。
;分配一個連續的字

5.
DCFS(或DCFSU)
語法格式:
標號
DCFS(或DCFSU)
運算式
DCFS(或DCFSU)虛擬指令用於為單精確度的浮點數分配一個連續的字
儲存單元並用虛擬指令中指定的運算式初始化。每個單精確度的浮點數佔據一個
字單元。
用DCFS分配的字儲存單元是字對齊的,而用DCFSU分配的字儲存單元並
不嚴格要求字對齊。
使用範例:
FDataTest
DCFS
2E5, -5E-7
;分配一個連續的字儲存
單元並初始化為指定的單精確度數。

6.
DCQ(或DCQU)
語法格式:
標號
DCQ(或DCQU) 運算式
DCQ(或DCQU)虛擬指令用於分配一個以8個位元組為單位的連續儲存區
域並用虛擬指令中指定的運算式初始化。
用DCQ分配的儲存單元是字對齊的,而用DCQU分配的儲存單元並不嚴格要
求字對齊。
使用範例:
DataTest
化為指定的值。
DCQ
100
;分配一個連續的儲存單元並初始

7.
SPACE
語法格式:
標號
SPACE 運算式
SPACE虛擬指令用於分配一個連續的儲存區域並初始化為0。其中,運算式
為要分配的位元組數。SPACE也可用“%”代替。
使用範例:
DataSpace
並初始化為0。
SPACE
100
;分配連續100位元組的儲存單元

8. MAP
語法格式:
MAP
運算式{,基址暫存器}
MAP虛擬指令用於定義一個結構化的記憶體表的首位址。MAP也可用“^
”代替。
運算式可以為程式中的標號或數學運算式,基址暫存器為可選項,當基址暫
存器選項不存在時,運算式的值即為記憶體表的首位址,當該選項存在時,記
憶體表的首位址為運算式的值與基址暫存器的和。
MAP虛擬指令通常與FIELD虛擬指令配合使用來定義結構化的記憶體表。
使用範例:
MAP
0x100, R0
首位址的值為0x100+R0
;定義結構化記憶體表

9.
FILED
語法格式:
標號
FIELD
運算式
FIELD虛擬指令用於定義一個結構化記憶體表中的資料欄。FILED也可用“#”
代替。
運算式的值為當前資料欄在記憶體表中所占的位元組數。
FIELD虛擬指令常與MAP虛擬指令配合使用來定義結構化的記憶體表。MAP
虛擬指令定義記憶體表的首位址,FIELD虛擬指令定義記憶體表中的各個資料欄
,並可以為每個資料欄指定一個標號供其他的指令引用。
注意MAP和FIELD虛擬指令僅用於定義資料結構,並不實際分配儲存單元。
使用範例:
MAP
0x100
A
FIELD
B
FIELD
S
FIELD
16
32
256
;定義結構化記憶體表首位址的值為0x100
;定義A的長度為16位元組,位置為0x100
;定義B的長度為32位元組,位置為0x110
;定義S的長度為256位元組,位置為0x130
 6-11.3 編譯控制(Assembly Control)虛擬指令
 編譯控制虛擬指令用於控制組合語言程式的執行流程,常用的編譯控制虛擬指
令包括以下幾條:
 IF、ELSE、ENDIF
 WHILE、WEND
 MACRO、MEND
 MEXIT

1.
IF、ELSE、ENDIF
語法格式:
IF
邏輯運算式
指令序列1
ELSE
指令序列2
ENDIF
IF、ELSE、ENDIF虛擬指令能根據條件的成立與否決定是否執行某個指令序
列。當IF後面的邏輯運算式為真,則執行指令序列1,否則執行指令序列2。其中,
ELSE及指令序列2可以沒有,此時,當IF後面的邏輯運算式為真,則執行指令序列
1,否則繼續執行後面的指令。
IF、ELSE、ENDIF虛擬指令可以嵌套使用。
使用範例:
GBLL
Test
;聲明一個全區的邏輯變數,變數名為Test
……
IF
Test = TRUE
指令序列1
ELSE
指令序列2
ENDIF

2.
WHILE、WEND
語法格式:
WHILE 邏輯運算式
指令序列
WEND
WHILE、WEND虛擬指令能根據條件的成立與否決定是否迴圈執行某個指令
序列。當WHILE後面的邏輯運算式為真,則執行指令序列,該指令序列執行完畢後
,再判斷邏輯運算式的值,若為真則繼續執行,一直到邏輯運算式的值為假。
WHILE、WEND虛擬指令可以嵌入使用。
使用範例:
GBLA Counter
Counter SETA
……
WHILE Counter < 10
指令序列
WEND
;聲明一個全區的數學變數,變數名為Counter
3
;由變數Counter控制迴圈次數

3.
MACRO、MEND
語法格式:
$標號
巨集名稱 $參數1,$參數2,……
指令序列
MEND
MACRO、MEND虛擬指令可以將一段程式碼定義為一個整體,稱為巨集指令
,然後就可以在程式中透過巨集指令多次呼叫該段程式碼。其中,$標號在巨集指令
被展開時,標號會被替換為用戶定義的符號,巨集指令可以使用一個或多個參數,
當巨集指令被展開時,這些參數被相應的值替換。
巨集指令的使用方式和功能與副程式有些相似,副程式可以提供模組化的程式
設計、節省儲存空間並提高執行速度。但在使用副程式結構時需要紀錄暫存器狀態
,從而增加了系統的開銷,因此,在程式碼較短且需要傳遞的參數較多時,可以使
用巨集指令代替副程式。
包含在MACRO和MEND之間的指令序列稱為巨集定義體,在巨集定義體的第
一行應聲明巨集的原型(包含巨集名、所需的參數),然後就可以在組合語言程式
中透過巨集名來呼叫該指令序列。在根源程式被編譯時,組譯器將巨集呼叫展開,
用巨集定義中的指令序列代替程式中的巨集呼叫,並將實際參數的值傳遞給巨集定
義中的形式參數。
MACRO、MEND虛擬指令可以嵌套使用。

4. MEXIT
語法格式:
MEXIT
MEXIT用於從巨集定義中跳躍出去。
 6-11.4 其他常用的虛擬指令
 還有一些其他的虛擬指令,在組合語言程式中經常會被使用,包括以下幾條
:













AREA
ALIGN
CODE16、CODE32
ENTRY
END
EQU
EXPORT(或GLOBAL)
IMPORT
EXTERN
GET(或INCLUDE)
INCBIN
RN
ROUT

1.
AREA
語法格式:
AREA 段名
屬性,屬性2……
AREA虛擬指令用於定義一個程式碼段或資料段。其中,段名若以數字開
頭,則該段名需用“|”括起來,如|1_test|。
屬性欄位表示該程式碼段(或資料段)的相關屬性,多個屬性用逗號分隔
。常用的屬性如下:

CODE屬性:用於定義程式碼段,預設為READONLY。

DATA屬性:用於定義資料段,預設為READWRITE。

READONLY屬性:指定本段為唯讀,程式碼段預設為READONLY。

READWRITE屬性:指定本段為可讀可寫,資料段的預設屬性為READWRITE。
 ALIGN屬性:使用方式為ALIGN 運算式。在預設時,ELF(可執行連接檔)的程
式碼段和資料段是按字對齊的,運算式的取值範圍為0~31,相應的對齊方式為2
運算式次方。
 COMMON屬性:該屬性定義一個通用的段,不包含任何的用戶程式碼和資料。各
原始檔案中同名的COMMON段共用同一段儲存單元。
一個組合語言程式至少要包含一個段,當程式太長時,也可以將程式分為多個程式
碼段和資料段。
使用範例:
AREA
Init, CODE, READONLY
指令序列
;該虛擬指令定義了一個程式碼段,段名為Init,屬性為唯讀

2.
ALIGN
語法格式:
ALIGN {運算式{,偏移量}}
ALIGN虛擬指令可透過添加填充位元組的方式,使當前位置滿足一定的對
齊方式。其中,運算式的值用於指定對齊方式,可能的取值為2的冪,如1、2、
4、8、16等。若未指定運算式,則將當前位置對齊到下一個字的位置。偏移量
也為一個數字運算式,若使用該欄位,則當前位置的對齊方式為:2的運算式次
冪+偏移量。
使用範例:
AREA Init, CODE, READONLY, ALIEN=3
元組對齊。
指令序列
END
;指定後面的指令為8位

3.
CODE16、CODE32
語法格式:
CODE16(或CODE32)
CODE16虛擬指令通知編譯器,其後的指令序列為16位元的Thumb指令。
CODE32虛擬指令通知編譯器,其後的指令序列為32位元的ARM指令。
若在編譯根源程式中同時包含ARM指令和Thumb指令時,可用CODE16虛
擬指令通知編譯器其後的指令序列為16位元的Thumb指令,CODE32虛擬指令
通知編譯器其後的指令序列為32位元的ARM指令。因此,在使用ARM指令和
Thumb指令混合編寫程式的程式碼裡,可用這兩條虛擬指令進行切換,但注意
他們只通知編譯器其後指令的類型,並不能對處理器進行狀態的切換。
令
使用範例:
AREA
Init, CODE, READONLY
……
CODE32
;通知編譯器其後的指令為32位元的ARM指
LDR
R0, =NEXT+1
;將跳躍位址放入暫存器R0
BX
R0
;程式跳躍到新的位置執行,並將處理器
切換到Thumb工作狀態
……
CODE16
;通知編譯器其後的指令為16位元的Thumb指令
NEXT LDR
R3, =0x3FF
……
END
;程式結束

4.
ENTRY
語法格式:
ENTRY
ENTRY虛擬指令用於指定組合語言程式的入口點。在一個完整的組合語言
程式中至少要有一個ENTRY(也可以有多個,當有多個ENTRY時,程式的真
正入口點由鏈結器指定),但在一個原始檔案裡最多只能有一個ENTRY(可
以沒有)。
使用範例:
AREA
Init, CODE, READONLY
ENTRY
;指定應用程式的入口點

5.
END
語法格式:
END
END虛擬指令用於通知編譯器已經到了根源程式的結尾。
使用範例:
AREA Init, CODE, READONLY
……
END
;指定應用程式的結尾

6.
EQU
語法格式:
名稱
EQU
運算式{,類型}
EQU虛擬指令用於為程式中的常數、標號等定義一個等效的字元名稱,類
似於C語言中的#define。其中EQU可用“*”代替。
名稱為EQU虛擬指令定義的字元名稱,當運算式為32位的常數時,可以指
定運算式的資料類型,可以有以下三種類型:
CODE16、CODE32和DATA
使用範例:
Test
EQU50 ; 定義標號Test的值為50
Addr
EQU
0x55, CODE32
;定義Addr的值為0x55,且該處
為32位元的ARM指令。

7.
EXPORT(或GLOBAL)
語法格式:
EXPORT
標號{[WEAK]}
EXPORT虛擬指令用於在程式中聲明一個全區的標號,該標號可在其他的
檔案中引用。EXPORT可用GLOBAL代替。標號在程式中區分大小寫,
[WEAK]選項聲明其他的同名標號優先於該標號被引用。
使用範例:
AREA
Init,CODE,READONLY
EXPORT
Stest
;聲明一個可全區引用的標號 Stest
……
END

8.
IMPORT
語法格式:
IMPORT
標號{[WEAK]}
IMPORT虛擬指令用於通知編譯器要使用的標號在其他的原始檔案中定義,
但要在當前原始檔案中引用,而且無論當前原始檔案是否引用該標號,該標號均
會被加入到當前原始檔案的符號表中。
標號在程式中區分大小寫,[WEAK]選項表示當所有的原始檔案都沒有定義
這樣一個標號時,編譯器也不給出錯誤資訊,在多數情況下將該標號置為0,若
該標號為B或BL指令引用,則將B或BL指令置為NOP操作。
使用範例:
AREA
Init, CODE, READONLY
IMPORT
Main
引用標號Main,但Main在其他原始檔案中定義
……
END
;通知編譯器當前檔案要

9.
EXTERN
語法格式:
EXTERN
標號{[WEAK]}
EXTERN虛擬指令用於通知編譯器要使用的標號在其他的原始檔案中定義
,但要在當前原始檔案中引用,如果當前原始檔案實際並未引用該標號,該標號
就不會被加入到當前原始檔案的符號表中。
標號在程式中區分大小寫,[WEAK]選項表示當所有的原始檔案都沒有定義
這樣一個標號時,編譯器也不給出錯誤資訊,在多數情況下將該標號置為0,若
該標號為B或BL指令引用,則將B或BL指令置為NOP操作。
使用範例:
AREA Init, CODE, READONLY
EXTERN
Main
Main
;通知編譯器當前檔案要引用標號
;但Main在其他原始檔案中定義
……
END

10.. GET(或INCLUDE)
語法格式:
GET
檔案名
GET虛擬指令用於將一個原始檔案包含到當前的原始檔案中,並將被包含的
原始檔案在當前位置進行編譯處理。可以使用INCLUDE代替GET。
組合語言程式中常用的方法是在某原始檔案中定義一些巨集指令,用EQU定
義常數的符號名稱,用MAP和FIELD定義結構化的資料類型,然後用GET虛擬指
令將這個原始檔案包含到其他的原始檔案中。使用方法與C語言中的“include”
相似。
GET虛擬指令只能用於包含原始檔案,包含目標檔需要使用INCBIN虛擬指令
使用範例:
AREA
Init, CODE, READONLY
GET
a1.s
案包含原始檔案a1.s
GET
C:\a2.s
始檔案C:\ a2.s
……
END
;通知編譯器當前原始檔
;通知編譯器當前原始檔案包含原

11. INCBIN
語法格式:
INCBIN
檔案名
INCBIN虛擬指令用於將一個目標檔或資料檔案包含到當前的原始檔案中,
被包含的檔不作任何變動的存放在當前檔中,編譯器從其後開始繼續處理。
使用範例:
AREA
Init, CODE, READONLY
INCBIN a1.dat
;通知編譯器當前原始檔案包含檔案a1.dat
INCBIN C:\a2.txt ;通知編譯器當前原始檔案包含檔案C:\a2.txt
……
END

12.

13.
RN
語法格式:
名稱
RN
運算式
RN虛擬指令用於給一個暫存器定義一個別名。採用這種方式可以方便程式
設計師記憶該暫存器的功能。其中,名稱為給暫存器定義的別名,運算式為暫存
器的編碼。
使用範例:
Temp
RN
R0
;將R0定義一個別名Temp
ROUT
語法格式:
{名稱}
ROUT
ROUT虛擬指令用於給一個區域變數定義作用範圍。在程式中未使用該虛擬
指令時,區域變數的作用範圍為所在的AREA,而使用ROUT後,區域變數的作
為範圍為當前ROUT和下一個ROUT之間。















6-12 問題與討論::
一、請說明B和BL指令的差別。
二、請完成下列指令執行的結果。
工作暫存器的初值:
R0 0x01 R1 0x03 R2 0x4 R3
(1) MOV
R1,R0,LSL#3
求 R0= _________ R1=___________
(2) MVN
R1,R0
求 R0= _________ R1=___________
(3) CMP
R1, R0
求 R0= _________ R1=___________
求 C旗標 = ____ N旗標 = ______
(4) CMNR1,R0
求 R0= _________ R1=___________
求 C旗標 = ____ N旗標 = ______
0x35

(5) ADD R2,R1,R0

求 R0= _________ R1=___________求 R2= _________
(6) ADC R7,R6,R5 (續接5)
求 R5= _________ R6=___________求 R7= _________
(7) SUB R2,R1,R0
求 R0= _________ R1=___________求 R2= _________
(8) SUBS R7,R6,R5 (續接7)
求 R5= _________ R6=___________求 R7= _________
(9) ORR R0,R0,R1
求 R0= _________ R1=___________
(10) BIC R0,R0,R1
求 R0= _________ R1=___________









