ARM 處理器的指令集可以分為 跳轉指令、數據處理指令、程序狀態寄存器(PSR)處理指令、加載/存儲指令、協處理器指令和異常產生指令 六大指令,這裡把其它幾個指令一起發了出來。
一、跳轉指令
跳轉指令用於實現程序流程的跳轉,在ARM程序中有以下兩種方法可以實現程序流程的跳轉。
Ⅰ.使用專門的跳轉指令;
Ⅱ.直接向程序計數器PC寫入跳轉地址值,通過向程序計數器PC寫入跳轉地址值,可以實現在4GB的地址空間中的任意跳轉,在跳轉之前結合使用MOV LR,PC等類似指令,可以保存將來的返回地址值,從而實現在4GB連續的線性地址空間的子程序調用。
ARM指令集中的跳轉指令可以完成從當前指令向前或向後的32MB的地址空間的跳轉,包括以下4條指令:
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(LR)中
3、BLX指令
BLX指令的格式為:
BLX 目標地址
BLX指令從ARM指令集跳轉到指令中所指定的目標地址,並將處理器的工作狀態有ARM狀態切換到Thumb狀態,該指令同時將PC的當前內容保存到寄存 器R14中。因此,當子程序使用Thumb指令集,而調用者使用ARM指令集時,可以通過BLX指令實現子程序的調用和處理器工作狀態的切換。同時,子程 序的返回可以通過將寄存器R14值復制到PC中來完成。
4、BX指令
BX指令的格式為:
BX{條件} 目標地址
BX指令跳轉到指令中所指定的目標地址,目標地址處的指令既可以是ARM指令,也可以是Thumb指令。
二、數據處理指令
數據處理指令可分為數據傳送指令、算術邏輯運算指令 和比較指令等。
數據傳送指令用於在寄存器和存儲器之間進行數據的雙向傳輸;
算術邏輯運算指令完成常用的算術與邏輯的運算,該類指令不但將運算結果保存在目的寄存器中,同時更新CPSR中的相應條件標志位;
比較指令不保存運算結果,只更新CPSR中相應的條件標志位。
數據處理指令共以下16條。
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
2、MVN指令(求反)
MVN指令的格式為:
MVN{條件}{S} 目的寄存器,源操作數
MVN指令可完成從另一個寄存器、被移位的寄存器、或將一個立即數加載到目的寄存器。與MOV指令不同之處是在傳送之前按位被取反了,即把一個被取反的值 傳送到目的寄存器中。其中S決定指令的操作是否影響CPSR中條件標志位的值,當沒有S時指令不更新CPSR中條件標志位的值。
指令示例:
MVN R0,#0 ;將 立即數0取反傳送到寄存器R0中,完成後R0=-1
3、CMP指令(比較)
CMP指令的格式為:
CMP{條件} 操作數1,操作數2
CMP指令用於把一個寄存器的內容和另一個寄存器的內容或立即數進行比較,同時更新CPSR中條件標志位的值。該指令進行一次減法運算,但不存儲結果,只 更改條件標志位。 標志位表示的是操作數1與操作數2的關系(大、小、相等),例如,當操作數1大於操作操作數2,則此後的有GT後綴的指令將可以執行。
指令示例:
CMP R1,R0 ;將寄存器R1的值與寄存器R0的值相減,並根據 結果設置CPSR的標
;志位
CMP R1,#100 ;將寄存器R1的值與立即數100相減,並根 據結果設置CPSR的標志位
4、CMN指令(負數比較)
CMN指令的格式為:
CMN{條件} 操作數1,操作數2
CMN指令用於把一個寄存器的內容和另一個寄存器的內容或立即數取反後進行比較,同時更新CPSR中條件標志位的值。該指令實際完成操作數1和操作數2相 加,並根據結果更改條件標志位。
指令示例:
CMN R1,R0 ;將寄存器R1的值與寄存器R0的值相加,並根據 結果設置CPSR
;的標志位
CMN R1,#100 ;將寄存器R1的值與立即數100相加,並根據 結果設置CPSR的標志位
5、TST指令(測試)
TST指令的格式為:
TST{條件} 操作數1,操作數2
TST指令用於把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的與運算,並根據運算結果更新CPSR中條件標志位的值。操作數1是要測試的數 據,而操作數2是一個位掩碼,該指令一般用來檢測是否設置了特定的位。
指令示例:
TST R1,#%1 ;用於測試在寄存器R1中是否設置了最低位(%表 示二進制數)
TST R1,#0xffe ;將寄存器R1的值與立即數0xffe按位與,並根據 結果設置CPSR
;的標志位
6、TEQ指令(測試相等)
TEQ指令的格式為:
TEQ{條件} 操作數1,操作數2
TEQ指令用於把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的異或運算,並根據運算結果更新CPSR中條件標志位的值。該指令通常用於比較操作數1和操作數2是否相等。
指令示例:
TEQ R1,R2 ;將寄存器R1的值與寄存器R2的值按位異或,並根據結果 設置CPSR
;的標志位
7、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)
8、ADC指令(帶進位相加)
ADC指令的格式為:
ADC{條件}{S} 目的寄存器,操作數1,操作數2
ADC指令用於把兩個操作數相加,再加上CPSR中的C條件標志位的值,並將結果存放到目的寄存器中。它使用一個進位標志位,這樣就可以做比32位大的數 的加法,注意不要忘記設置S後綴來更改進位標志。操作數1應是一個寄存器,操作數2可以是一 個寄存器,被移位的寄存器,或一個立即數。
以下指令序列完成兩個128位數的加法,第一個數由高到低存放在寄存器R7~R4,第二個數由高到低存放在寄存器R11~R8,運算結果由高到低存放在寄 存器R3~R0:
ADDS R0,R4,R8 ; 加低端的字
ADCS R1,R5,R9 ; 加第二個字,帶進位
ADCS R2,R6,R10 ; 加第三個字,帶進位
ADC R3,R7,R11 ; 加第四個字,帶進位
9、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)
10、~~~~C指令
~~~~C指令的格式為:
~~~~C{條件}{S} 目的寄存器,操作數1,操作數2
~~~~C指令用於把操作數1減去操作數2,再減去CPSR中的C條件標志位的反碼,並將結果存放到目的寄存器中。操作數1應是一個寄存器,操作數2可以 是一個寄存器,被移位的寄存器,或一個立即數。該指令使用進位標志來表示借位,這樣就可以做大於32位的減法,注意不要忘記設置S後綴來更改進位標志。該指令可用於有符號數或無符號數的減法運算。
指令示例:
SUBS R0,R1,R2 ;R0 = R1 - R2 - !C,並根據結果設置CPSR的進位標志位
11、R~~~~指令
R~~~~指令的格式為:
R~~~~{條件}{S} 目的寄存器,操作數1,操作數2
R~~~~指令稱為逆向減法指令,用於把操作數2減去操作數1,並將結果存放到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位 的寄存器,或一個立即數。該指令可用於有符號數或無符號數的減法運算。
指令示例:
R~~~~ R0,R1,R2 ; R0 = R2 – R1
R~~~~ R0,R1,#256 ; R0 = 256 – R1
R~~~~ R0,R2,R3,LSL#1 ; R0 = (R3 << 1) - R2
12、RSC指令(反向帶進位減)
RSC指令的格式為:
RSC{條件}{S} 目的寄存器,操作數1,操作數2
RSC指令用於把 操作數2減去操作數1,再減去CPSR中的C條件標志位的反碼,並將結果存放到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位 的寄存器,或一個立即數。該指令使用進位標志來表示借位,這樣就可以做大於32位的減法,注意不要忘記設置S後綴來更改進位標志。該指令可用於有符號數或 無符號數的減法運算。
指令示例:
RSC R0,R1,R2 ;R0 = R2 – R1 - !C
13、AND指令(邏輯位 與)
AND指令的格式為:
AND{條件}{S} 目的寄存器,操作數1,操作數2
AND指令用於在兩個操作數上進行邏輯與運算,並把結果放置到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個 立即數。該指令常用於屏蔽操作數1的某些位。
指令示例:
AND R0,R0,#3 ;該指令保持R0的0、1位,其余位清零。
14、ORR指令(邏輯位 或)
ORR指令的格式為:
ORR{條件}{S} 目的寄存器,操作數1,操作數2
ORR指令用於在兩個操作數上進行邏輯或運算,並把結果放置到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個 立即數。該指令常用於設置操作數1的某些位。
指令示例:
ORR R0,R0,#3 ;該指令設置R0的0、1位,其余位保持不變。
15、EOR指令(邏輯位 異或)
EOR指令的格式為:
EOR{條件}{S} 目的寄存器,操作數1,操作數2
EOR指令用於在兩個操作數上進行邏輯異或運算,並把結果放置到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一 個立即數。該指令常用於反轉操作數1的某些位。
指令示例:
EOR R0,R0,#3 ;該指令反轉R0的0、1位,其余位保持不變。
16、BIC指令(位清零)
BIC指令的格式為:
BIC{條件}{S} 目的寄存器,操作數1,操作數2
BIC指令用於清除操作數1的某些位,並把結果放置到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。 操作數2為32位的掩碼,如果在掩碼中設置了某一位,則清除這一位。未設置的掩碼位保持不 變。
指令示例:
BIC R0,R0,#%1011 ;該指令清除R0中的位 0、1、和 3,其余的位保持不變。
三、乘法指令與乘加指令
ARM 微處理器支持的乘法指令與乘加指令共有6條,可分為運算結果為32位和運算結果為64位兩類,與前面的數據處理指令不同,指令中的所有操作數、目的寄存器 必須為通用寄存器,不能對操作數使用立即數或被移位的寄存器,同時,目的寄存器和操作數1必須是不同的寄存器。
乘法指令與乘加指令共有以下6條:
1、MUL指令(相乘)
MUL指令的格式為:
MUL{條件}{S} 目的寄存器,操作數1,操作數2
MUL指令完成將操作數1與操作數2的乘法運算,並把結果放置到目的寄存器中,同時可以根據運算結果設置CPSR中相應的條件標志位。其中,操作數1和操 作數2均為32位的有符號數或無符號數。
指令示例:
MUL R0,R1,R2 ;R0 = R1 × R2
MULS R0,R1,R2 ;R0 = R1 × R2,同時設置CPSR中的相關條件標志位
2、MLA指令(帶累加的相乘)
MLA指令的格式為:
MLA{條件}{S} 目的寄存器,操作數1,操作數2,操作數3
MLA指令完成將操作數1與操作數2的乘法運算,再將乘積加上操作數3,並把結果放置到目的寄存器中,同時可以根據運算結果設置CPSR中相應的條件標志 位。其中,操作數1和操作數2均為32位的有符號數或無符號數。
指令示例:
MLA R0,R1,R2,R3 ;R0 = R1 × R2 + R3
MLAS R0,R1,R2,R3 ;R0 = R1 × R2 + R3,同時設置CPSR中的相關條件標志位
3、SMULL指令
SMULL指令的格式為:
SMULL{條件}{S} 目的寄存器Low,目的寄存器High,操作數1,操作數2
SMULL指令完成將操作數1與操作數2的乘法運算,並把結果的低32位放置到目的寄存器Low中,結果的高32位放置到目的寄存器High中,同時可以 根據運算結果設置CPSR中相應的條件標志位。其中,操作數1和操作數2均為32位的有符號數。
指令示例:
SMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位
;R1 = (R2 × R3)的高32位
4、SMLAL指令
SMLAL指令的格式為:
SMLAL{條件}{S} 目的寄存器Low,目的寄存器High,操作數1,操作數2
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 ;R0 = (R2 × R3)的低32位 + R0
;R1 = (R2 × R3)的高32位 + R1
5、UMULL指令
UMULL指令的格式為:
UMULL{條件}{S} 目的寄存器Low,目的寄存器High,操作數1,操作數2
UMULL指令完成將操作數1與操作數2的乘法運算,並把結果的低32位放置到目的寄存器Low中,結果的高32位放置到目的寄存器High中,同時可以 根據運算結果設置CPSR中相應的條件標志位。其中,操作數1和操作數2均為32位的無符號數。
指令示例:
UMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位
;R1 = (R2 × R3)的高32位
6、UMLAL指令
UMLAL指令的格式為:
UMLAL{條件}{S} 目的寄存器Low,目的寄存器High,操作數1,操作數2
UMLAL指令完成將操作數1與操作數2的乘法運算,並把結果的 低32位同目的寄存器Low中的值相加後又放置到目的寄存器Low中,結果的高32位同目的寄存器High中的值相加後又放置到目的寄存器High 中,同 時可以根據運算結果設置CPSR中相應的條件標志位。其中,操作數1和操作數2均為32位的無符號數。
對於目的寄存器Low,在指令執行前存放64位加數的低32位,指令執行後存放結果的低32位;對於目的寄存器High,在指令執行前存放64位加數的高32位,指令執行後存放結果的高32位。
指令示例:
UMLAL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位 + R0
;R1 = (R2 × R3)的高32位 + R1
四、程序狀態寄存器訪問指令
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微處理器支持加載/存儲指令用於在寄存器和存儲器之間傳送數據,加載指令用於將存儲器中的數據傳送到寄存器,存儲 指令則完成相反的操作。常用的加載存儲指令如下:
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 為地址的存儲器中。
六、批量數據加載/存儲指令。
ARM微處理器所支持批量數據加載/存儲指令可以一次在一片連續的存儲器單元和多個寄存器之間傳送數據,批量加載指令 用於將一片連續的存儲器中的數據傳送到多個寄存器,批量數據存儲指令則完成相反的操作。
常用的加載存儲指令如下:
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、SWP指令
SWP指令的格式為:
SWP{條件} 目的寄存器,源寄存器1,[源寄存器2]
SWP指令用於將源寄存器2所指向的存儲器中的字數據傳送到目的寄存器中,同時將源寄存器1中的字數據傳送到源寄存器2所指向的存儲器中。顯然,當源寄存 器1和目的寄存器為同一個寄存器時,指令交換該寄存器和存儲器的內容。
指令示例:
SWP R0,R1,[R2] ;將R2所指向的存儲器中的字數據傳送到R0,同時將R1 中的字數據傳送到R2所指向的存儲單元。
SWP R0,R0,[R1] ;該指令完成將R1所指向的存儲器中的字數 據與R0中的數據交換。
2、SWPB指令
SWPB指令的格式為:
SWP{條件}B 目的寄存器,源寄存器1,[源寄存器2]
SWPB指令用於將源寄存器2所指向的存儲器中的字節數據傳送到目的寄存器中,目的寄存器的高24清零,同時將源寄存 器1中的字節數據傳送到源寄存器2所指向的存儲器中。顯然,當源寄存器1和目的寄存器為同一個寄存器時,指令交換該寄存器和存儲器的內容。
指令示例:
SWPB R0,R1,[R2] ;將R2所指向的存儲器中的字節數據傳送到 R0,R0的高24位清零,同時將R1中的低8位數據傳送到R2所指向的存儲單元。
SWPB R0,R0,[R1] ;該指令完成將R1所指向的存儲器中的 字節數據與R0中的低8位數據交換。
八、移位指令
1、LSL(或ASL)
LSL(或ASL)的格式為:
通用寄存器,LSL(或ASL) 操作數
LSL(或ASL)可完成對通用寄存器中的內容進行邏輯(或算術)的左移操作,按操作數所指定的數量向左移位,低位用零來填充。 其中,操作數可以是通用寄存器,也可以是立即數(0~31)。
操作示例
MOV R0, R1, LSL #2 ;將R1中的內容左移兩位後傳送到R0 中。
2、LSR
LSR的格式為:
通用寄存器,LSR 操作數
LSR可完成對通用寄存器中的內容進行右移的操作,按操作數所指定的數量向右移位,左端用零來填充。其中,操作數可以 是通用寄存器,也可以是立即數(0~31)。
操作示例:
MOV R0, R1, LSR #2 ;將R1中的內容右移兩位後傳送到R0 中,左端用零來填充。
3、ASR
ASR的格式為:
通用寄存器,ASR 操作數
ASR可完成對通用寄存器中的內容進行右移的操作,按操作數所指定的數量向右移位,左端用第31位的值來填充。其中,操作數可以是通用寄存器,也可以是立 即數(0~31)。
操作示例:
MOV R0, R1, ASR #2 ;將R1中的內容右移兩位後傳送到R0 中,左端用第31位的值來填充。
4、ROR
ROR的格式為:
通用寄存器,ROR 操作數
ROR可完成對通用寄存器中的內容進行循環右移的操作,按操作數所指定的數量向右循環移位,左端用右端移出的位來填充。其中,操作數可以是通用寄存器,也 可以是立即數(0~31)。顯然,當進行32位的循環右移操作時,通用寄存器中的值不改變。
操作示例:
MOV R0, R1, ROR #2 ;將R1中的內容循環右移兩位後傳送到R0 中。
5、RRX
RRX的格式為:
通用寄存器,RRX 操作數
RRX可完成對通用寄存器中的內容進行帶擴展的循環右移的操作,按操作數所指定的數量向右循環移位,左端用進位標志位C來填充。其中,操作數可以是通用寄 存器,也可以是立即數(0~31)。
操作示例:
MOV R0, R1, RRX #2 ;將R1中的內容進行帶擴展的循環右移兩位 後傳送到R0中。