ARM彙編指令集彙總

Saint發表於2018-10-26

作者:毛蘢瑋 / Saint

掘金:juejin.im/user/5aa1f8…

微博:weibo.com/5458277467/…

GitHub :github.com/saint-000

ARM彙編指令集彙總

今天Saint給大家分享一下對彙編指令程式碼的彙總。

一.彙編資料處理指令

1.資料傳送指令

【MOV指令】:它的傳送指令只能是把一個暫存器的值(要能用立即數表示)賦給另一個暫存器,或者將一個常量賦給暫存器,將後邊的量賦給前邊的量。

MOV指令的格式為:MOV{條件}{S} 目的暫存器,源運算元
複製程式碼

MOV指令中,條件預設時指令無條件執行;S選項決定指令的操作是否影響CPSR中條件標誌位的值,當沒有S時指令不更新CPSR中條件標誌位的值。

指令示例:
MOV R1,R0   ;將暫存器R0的值傳送到暫存器R1
MOV PC,R14   ;將暫存器R14的值傳送到PC,常用於子程式返回
MOV R1,R0,LSL#3 ;將暫存器R0的值左移3位後傳送到R1(即乘8)
MOVS PC, R14	  ;將暫存器R14的值傳送到PC中,返回到呼叫程式碼並恢復標誌位
複製程式碼

ARM彙編指令集彙總

除了MOV指令外,還有資料取反傳送指令MVN。 【MVN指令】

MVN指令的格式為:
MVN{條件}{S} 目的暫存器,源運算元
複製程式碼

MVN指令可完成從另一個暫存器、被移位的暫存器、或將一個立即數載入到目的暫存器。與MOV指令不同之處是在傳送之前按位被取反了,即把一個被取反的值傳送到目的暫存器中。其中S決定指令的操作是否影響CPSR中條件標誌位的值,當沒有S時指令不更新CPSR中條件標誌位的值。

指令示例:
MVN R0,#0   ;將立即數0取反傳送到暫存器R0中,完成後R0=-1(有符號位取反)
複製程式碼

2.算術運算指令

(1)【加法指令】:ADD

ADD指令的格式為:
ADD{條件}{S} 目的暫存器,運算元1,運算元2
複製程式碼

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)
複製程式碼

(2)【帶進位的加法指令】:ADC

ADC指令的格式為:
ADC{條件}{S} 目的暫存器,運算元1,運算元2
複製程式碼

ADC指令用於把兩個運算元相加,再加上CPSR中的C條件標誌位的值,並將結果存放到目的暫存器中。它使用一個進位標誌位,這樣就可以做比32位大的數的加法,注意不要忘記設定S字尾來更改進位標誌。運算元1應是一個暫存器,運算元2可以是一個暫存器,被移位的暫存器,或一個立即數。 以下指令序列完成兩個128位數(此處應為兩個四字數相加)的加法,第一個數由高到低存放在暫存器R7~R4,第二個數由高到低存放在暫存器R11~R8,運算結果由高到低存放在暫存器R3~R0:

ADDS  R0,R4,R8          ; 加低端的字,R0=R4+R8
ADCS  R1,R5,R9            ; 加第二個字,帶進位,R1=R5+R9
ADCS  R2,R6,R10       ; 加第三個字,帶進位,R2=R6+R10
ADC  R3,R7,R11       ; 加第四個字,帶進位,R3=R7+R11
複製程式碼

(3)【減法指令】:SUB

SUB指令的格式為:
SUB{條件}{S} 目的暫存器,運算元1,運算元2
複製程式碼

SUB指令用於把運算元1減去運算元2,並將結果存放到目的暫存器中。運算元1應是一個暫存器,運算元2可以是一個暫存器,被移位的暫存器,或一個立即數。該指令可用於有符號數或無符號數的減法運算。

指令示例:
SUB  R0,R1,R2           ; R0 = R1 - R2
SUB  R0,R1,#256            ; R0 = R1 - 256
SUB  R0,R2,R3,LSL#1      ; R0 = R2 - (R3 << 1)

複製程式碼

(4)【帶借位減法指令】:SBC

SBC指令的格式為:
SBC{條件}{S} 目的暫存器,運算元1,運算元2
複製程式碼

BC指令用於把運算元1減去運算元2,再減去CPSR中的C條件標誌位的反碼,並將結果存放到目的暫存器中。運算元1應是一個暫存器,運算元2可以是一個暫存器,被移位的暫存器,或一個立即數。該指令使用進位標誌來表示借位,這樣就可以做大於32位的減法,注意不要忘記設定S字尾來更改進位標誌。該指令可用於有符號數或無符號數的減法運算。 指令示例:

SUBS  R0,R1,R2           ;R0 = R1 - R2 - !C,並根據結果設定CPSR的進位標誌位

複製程式碼

3.比較指令 (1)【直接比較指令】:CMP

CMP指令的格式為:
CMP{條件} 運算元1,運算元2
複製程式碼
複製程式碼

CMP指令用於把一個暫存器的內容和另一個暫存器的內容或立即數進行比較,同時更新CPSR中條件標誌位的值。該指令進行一次減法運算,但不儲存結果,只更改條件標誌位。標誌位表示的是運算元1與運算元2的關係(大、小、相等),例如,當運算元1大於操作運算元2,則此後的有GT 字尾的指令將可以執行。

指令示例:
CMP R1,R0   ;將暫存器R1的值與暫存器R0的值相減,並根據結果設定CPSR的標誌位
CMP R1,#100  ;將暫存器R1的值與立即數100相減,並根據結果設定CPSR的標誌位
複製程式碼

(2)【負數比較指令】:CMN

CMN指令的格式為:
CMN{條件} 運算元1,運算元2
複製程式碼

CMN指令用於把一個暫存器的內容和另一個暫存器的內容或立即數取反後進行比較,同時更新CPSR中條件標誌位的值。該指令實際完成運算元1和運算元2相加,並根據結果更改條件標誌位。

指令示例:
CMN R1,R0   ;將暫存器R1的值與暫存器R0的值相加,並根據結果設定CPSR的標誌位
CMN R1,#100  ;將暫存器R1的值與立即數100相加,並根據結果設定CPSR的標誌位
複製程式碼

4.邏輯運算指令 (1)【邏輯與指令】:AND

AND指令的格式為:
AND{條件}{S} 目的暫存器,運算元1,運算元2
複製程式碼

AND指令用於在兩個運算元上進行邏輯與運算,並把結果放置到目的暫存器中。運算元1應是一個暫存器,運算元2可以是一個暫存器,被移位的暫存器,或一個立即數。該指令常用於遮蔽運算元1的某些位。 指令示例: AND  R0,R0,#3           ; 該指令保持R0的0、1位,其餘位清零。

(2)【邏輯或指令】:ORR

ORR指令的格式為:
ORR{條件}{S} 目的暫存器,運算元1,運算元2
複製程式碼

ORR指令用於在兩個運算元上進行邏輯或運算,並把結果放置到目的暫存器中。運算元1應是一個暫存器,運算元2可以是一個暫存器,被移位的暫存器,或一個立即數。該指令常用於設定運算元1的某些位。

指令示例:
ORR  R0,R0,#3           ; 該指令設定R0的0、1位,其餘位保持不變。
複製程式碼

(3)【邏輯異或指令】:EOR

EOR指令的格式為:
EOR{條件}{S} 目的暫存器,運算元1,運算元2
複製程式碼

EOR指令用於在兩個運算元上進行邏輯異或運算,並把結果放置到目的暫存器中。運算元1應是一個暫存器,運算元2可以是一個暫存器,被移位的暫存器,或一個立即數。該指令常用於反轉運算元1的某些位。

指令示例:
EOR  R0,R0,#3           ; 該指令反轉R0的0、1位,其餘位保持不變。
複製程式碼

(4)【位清零指令】:BIC

BIC指令的格式為:
BIC{條件}{S} 目的暫存器,運算元1,運算元2
複製程式碼

BIC指令用於清除運算元1的某些位,並把結果放置到目的暫存器中。運算元1應是一個暫存器,運算元2可以是一個暫存器,被移位的暫存器,或一個立即數。運算元2為32位的掩碼,如果在掩碼中設定了某一位,則清除這一位。未設定的掩碼位保持不變。

指令示例:
BIC  R0,R0,#%1011         ; 該指令清除 R0 中的位 0、1、和 3,其餘的位保持不變。
複製程式碼

5.測試指令 (1)【位測試指令】:TST

TST指令的格式為:
TST{條件} 運算元1,運算元2
複製程式碼

TST指令用於把一個暫存器的內容和另一個暫存器的內容或立即數進行按位的與運算,並根據運算結果更新CPSR中條件標誌位的值。運算元1是要測試的資料,而運算元2是一個位掩碼,該指令一般用來檢測是否設定了特定的位。

指令示例:
TST R1,#%1  ;用於測試在暫存器R1中是否設定了最低位(%表示二進位制數)
TST R1,#0xffe  ;將暫存器R1的值與立即數0xffe按位與,並根據結果設定CPSR的標誌位
複製程式碼

(2)【位測試指令】:TEQ

TEQ指令的格式為:
TEQ{條件} 運算元1,運算元2
複製程式碼

TEQ指令用於把一個暫存器的內容和另一個暫存器的內容或立即數進行按位的異或運算,並根據運算結果更新CPSR中條件標誌位的值。該指令通常用於比較運算元1和運算元2是否相等。

指令示例:
TEQ R1,R2  ;將暫存器R1的值與暫存器R2的值按位異或,並根據結果設定CPSR的標誌位
複製程式碼

6.乘法指令

ARM彙編指令集彙總

二.彙編轉移指令

【跳轉指令】  跳轉指令用於實現程式流程的跳轉,在ARM程式中有兩種方法可以實現程式流程的跳轉:

— 使用專門的跳轉指令。
— 直接向程式計數器PC寫入跳轉地址值。
複製程式碼

通過向程式計數器PC寫入跳轉地址值,可以實現在4GB的地址空間中的任意跳轉,在跳轉之前結合使用MOV LR,PC等類似指令,可以儲存將來的返回地址值,從而實現在4GB連續的線性地址空間的子程式呼叫。  ARM指令集中的跳轉指令可以完成從當前指令向前或向後的32MB的地址空間的跳轉,包括以下4條指令:

 — B 跳轉指令
— BL 帶返回的跳轉指令
— BLX 帶返回和狀態切換的跳轉指令
— BX 帶狀態切換的跳轉指令
複製程式碼

1、【B指令】

B指令的格式為:
B{條件} 目標地址
複製程式碼

B指令是最簡單的跳轉指令。一旦遇到一個 B 指令,ARM 處理器將立即跳轉到給定的目標地址,從那裡繼續執行。注意儲存在跳轉指令中的實際值是相對當前PC值的一個偏移量,而不是一個絕對地址,它的值由彙編器來計算(參考定址方式中的相對定址)。它是 24 位有符號數,左移兩位後有符號擴充套件為 32 位,表示的有效偏移為 26 位(前後32MB的地址空間)。

以下指令:
B  Label  ;程式無條件跳轉到標號Label處執行
CMP R1,#0  ;當CPSR暫存器中的Z條件碼置位時,程式跳轉到標號Label處執行
BEQ Label  
複製程式碼

2、【BL指令】

BL指令的格式為:
BL{條件}  目標地址
複製程式碼

BL 是另一個跳轉指令,但跳轉之前,會在暫存器R14中儲存PC的當前內容,因此,可以通過將R14 的內容重新載入到PC中,來返回到跳轉指令之後的那個指令處執行。該指令是實現子程式呼叫的一個基本但常用的手段。

以下指令:
BL Label  ;當程式無條件跳轉到標號Label處執行時,同時將當前的PC值儲存到R14中
複製程式碼

3、【BLX指令】

BLX指令的格式為:
BLX  目標地址
複製程式碼

BLX指令從ARM指令集跳轉到指令中所指定的目標地址,並將處理器的工作狀態有ARM狀態切換到Thumb狀態,該指令同時將PC的當前內容儲存到暫存器R14中。因此,當子程式使用Thumb指令集,而呼叫者使用ARM指令集時,可以通過BLX指令實現子程式的呼叫和處理器工作狀態的切換。同時,子程式的返回可以通過將暫存器R14值複製到PC中來完成。

4、【BX指令】

BX指令的格式為:
BX{條件}  目標地址
複製程式碼

BX指令跳轉到指令中所指定的目標地址,目標地址處的指令既可以是ARM指令,也可以是Thumb指令。

三.彙編程式狀態暫存器訪問指令

1、【MRS指令】 MRS指令的格式為: MRS{條件} 通用暫存器,程式狀態暫存器(CPSR或SPSR) MRS指令用於將程式狀態暫存器的內容傳送到通用暫存器中。該指令一般用在以下幾種情況:

- 當需要改變程式狀態暫存器的內容時,可用MRS將程式狀態暫存器的內容讀入通用暫存器,修改後再寫回程式狀態暫存器。
 - 當在異常處理或程式切換時,需要儲存程式狀態暫存器的值,可先用該指令讀出程式狀態暫存器的值,然後儲存。

複製程式碼
指令示例:
MRS R0,CPSR   ;傳送CPSR的內容到R0
MRS R0,SPSR   ;傳送SPSR的內容到R0
複製程式碼

2、【MSR指令】

MSR指令的格式為:
MSR{條件} 程式狀態暫存器(CPSR或SPSR)_<域>,運算元
複製程式碼

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中的控制位域
複製程式碼

四.彙編載入/儲存指令

ARM微處理器支援載入/儲存指令用於在暫存器和儲存器之間傳送資料,載入指令用於將儲存器中的資料傳送到暫存器,儲存指令則完成相反的操作。常用的載入儲存指令如下:

ARM彙編指令集彙總

1、【LDR指令】

LDR指令的格式為:
LDR{條件} 目的暫存器,<儲存器地址>
複製程式碼

LDR指令用於從儲存器中將一個32位的字資料傳送到目的暫存器中。該指令通常用於從儲存器中讀取32位的字資料到通用暫存器,然後對資料進行處理。當程式計數器PC作為目的暫存器時,指令從儲存器中讀取的字資料被當作目的地址,從而可以實現程式流程的跳轉。

指令示例:
LDR  R0,[R1]             ;將儲存器地址為R1的字資料讀入暫存器R0。
LDR  R0,[R1,R2]        ;將儲存器地址為R1+R2的字資料讀入暫存器R0。
LDR  R0,[R1,#8]        ;將儲存器地址為R1+8的字資料讀入暫存器R0。
LDR  R0,[R1,R2] !       ;將儲存器地址為R1+R2的字資料讀入暫存器R0,並將新地址R1+R2寫入R1。
LDR  R0,[R1,#8] !       ;將儲存器地址為R1+8的字資料讀入暫存器R0,並將新地址R1+8寫入R1。
LDR  R0,[R1],R2        ;將儲存器地址為R1的字資料讀入暫存器R0,並將新地址R1+R2寫入R1。
LDR  R0,[R1,R2,LSL#2]! ;將儲存器地址為R1+R2×4的字資料讀入暫存器R0,並將新地址R1+R2×4寫入R1。
LDR  R0,[R1],R2,LSL#2  ;將儲存器地址為R1的字資料讀入暫存器R0,並將新地址R1+R2×4寫入R1。
複製程式碼

2、【LDRB指令】

LDRB指令的格式為:
LDR{條件}B 目的暫存器,<儲存器地址>
複製程式碼

LDRB指令用於從儲存器中將一個8位的位元組資料傳送到目的暫存器中,同時將暫存器的高24位清零。該指令通常用於從儲存器中讀取8位的位元組資料到通用暫存器,然後對資料進行處理。當程式計數器PC作為目的暫存器時,指令從儲存器中讀取的字資料被當作目的地址,從而可以實現程式流程的跳轉。

指令示例:
LDRB  R0,[R1]      ;將儲存器地址為R1的位元組資料讀入暫存器R0,並將R0的高24位清零。
LDRB  R0,[R1,#8]     ;將儲存器地址為R1+8的位元組資料讀入暫存器R0,並將R0的高24位清零。
複製程式碼

3、【LDRH指令】

LDRH指令的格式為:
LDR{條件}H 目的暫存器,<儲存器地址>
複製程式碼

LDRH指令用於從儲存器中將一個16位的半字資料傳送到目的暫存器中,同時將暫存器的高16位清零。該指令通常用於從儲存器中讀取16位的半字資料到通用暫存器,然後對資料進行處理。當程式計數器PC作為目的暫存器時,指令從儲存器中讀取的字資料被當作目的地址,從而可以實現程式流程的跳轉。

指令示例:
LDRH  R0,[R1]      ;將儲存器地址為R1的半字資料讀入暫存器R0,並將R0的高16位清零。
LDRH  R0,[R1,#8]     ;將儲存器地址為R1+8的半字資料讀入暫存器R0,並將R0的高16位清零。
LDRH  R0,[R1,R2]     ;將儲存器地址為R1+R2的半字資料讀入暫存器R0,並將R0的高16位清零。
複製程式碼

4、【STR指令】

STR指令的格式為:
STR{條件} 源暫存器,<儲存器地址>
複製程式碼

STR指令用於從源暫存器中將一個32位的字資料傳送到儲存器中。該指令在程式設計中比較常用,且定址方式靈活多樣,使用方式可參考指令LDR。

指令示例:
STR R0,[R1],#8 ;將R0中的字資料寫入以R1為地址的儲存器中,並將新地址R1+8寫入R1。
STR R0,[R1,#8] ;將R0中的字資料寫入以R1+8為地址的儲存器中。
複製程式碼

5、【STRB指令】

STRB指令的格式為:
STR{條件}B 源暫存器,<儲存器地址>
複製程式碼

STRB指令用於從源暫存器中將一個8位的位元組資料傳送到儲存器中。該位元組資料為源暫存器中的低8位。

指令示例:
STRB  R0,[R1]      ;將暫存器R0中的位元組資料寫入以R1為地址的儲存器中。
STRB  R0,[R1,#8]     ;將暫存器R0中的位元組資料寫入以R1+8為地址的儲存器中
複製程式碼

6、【STRH指令】

STRH指令的格式為:
STR{條件}H 源暫存器,<儲存器地址>
複製程式碼

STRH指令用於從源暫存器中將一個16位的半字資料傳送到儲存器中。該半字資料為源暫存器中的低16位。

指令示例:
STRH  R0,[R1]      ;將暫存器R0中的半字資料寫入以R1為地址的儲存器中。
STRH  R0,[R1,#8]     ;將暫存器R0中的半字資料寫入以R1+8為地址的儲存器中。
複製程式碼

7、【批量資料載入/儲存指令指令】 ARM微處理器所支援批量資料載入/儲存指令可以一次在一片連續的儲存器單元和多個暫存器之間傳送資料,批量載入指令用於將一片連續的儲存器中的資料傳送到多個暫存器,批量資料儲存指令則完成相反的操作。常用的載入儲存指令如下:

 — LDM  批量資料載入指令
— STM  批量資料儲存指令
複製程式碼
【LDM(或STM)指令】
LDM(或STM)指令的格式為:
LDM(或STM){條件}{型別} 基址暫存器{!},暫存器列表{∧}

複製程式碼

LDM(或STM)指令用於從由基址暫存器所指示的一片連續儲存器到暫存器列表所指示的多個暫存器之間傳送資料,該指令的常見用途是將多個暫存器的內容入棧或出棧。其中,{型別}為以下幾種情況:

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)。
複製程式碼

五.彙編異常產生指令

1、【SWI指令】

SWI指令的格式為:
SWI{條件} 24位的立即數
複製程式碼

SWI指令用於產生軟體中斷,以便使用者程式能呼叫作業系統的系統例程。作業系統在SWI的異常處理程式中提供相應的系統服務,指令中24位的立即數指定使用者程式呼叫系統例程的型別,相關引數通過通用暫存器傳遞,當指令中24位的立即數被忽略時,使用者程式呼叫系統例程的型別由通用暫存器R0的內容決定,同時,引數通過其他通用暫存器傳遞。

指令示例:
SWI  0x02      ;該指令呼叫作業系統編號位02的系統例程。
複製程式碼

2、【BKPT指令】

BKPT指令的格式為:
BKPT   16位的立即數
複製程式碼

BKPT指令產生軟體斷點中斷,可用於程式的除錯。

六.彙編虛擬碼

1.【AREA】一個彙編程式至少要包含一個段,當程式太長時,也可以將程式分為多個程式碼段和資料段,因此在彙編程式的開頭,我們一般的語句會用到AREA。

語法格式:AREA 段名 屬性 1 ,屬性 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;指定後面的指令為 8 位元組對齊。      
....
;指令序列  
.... 
END      
  
複製程式碼

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 ;指定應用程式的結尾
複製程式碼