ARM組合語言最常用指令

csdn2497242041發表於2015-11-29

ARM組合語言最常用指令

一、ARM組合語言的特點:

1.所有運算處理都是發生在通用暫存器(一般是R0~R14)之中。所有儲存器空間(如C語言變數的本質就是一個儲存器空間上的幾個BYTE)的值的處理,都是要傳送到通用暫存器來完成.因此程式碼中大量看到LDR,STR指令來傳送值.

2.ARM彙編語句中.當前語句很多時候要隱含的使用上一句的執行結果.而且上一句的執行結果,是放在CPSR暫存器裡,(比如說進位,為0,為負…)

CMP  R0,R1

BNE  NoMatch

比如上一BNE隱含的使用的上一句CMP執行結果.NE字尾表示使用Z標誌位.兩句合起來的意思就是,如果R0,R1的值不相等,就跳轉到NoMatch處執行.

注意:PC=R15,CPSR=R16

3.ARM偽指令不是必須的,但是一個完整程式沒有偽指令幾乎很難寫出來.

①比如一個程式至少包含READONLY AREA和ENTRY,否則CPU都無法知道從哪裡開始執行。

②ARM屬於RISC,指令並不多,但是可以帶字尾表示擴充套件出不同用法,這裡與X86彙編完全不同風格。

③如BNE實際上是B指令的變種,本質還是同一類指令.只是多一個對CPSR的Z標誌位的判斷。


二、ARM處理器的指令集

ARM處理器的指令集可以分為跳轉指令、資料處理指令、程式狀態暫存器(PSR)處理指令、載入/儲存指令、協處理器指令和異常產生指令6大指令。


1BL指令

格式:BL{條件}目標地址


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


指令示例:

BL  Label         ;當程式無條件跳轉到標號Label處執行時,同時將當前的 PC值儲存到R14(LR)中


2MOV指令(傳送)

格式: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


3CMP指令(比較)

格式:CMP{條件}運算元1,運算元2


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


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


4ADD指令(相加)

格式: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)

 

類似算數指令:

①SUB指令(相減):

格式:SUB{條件}{S} 目的暫存器,運算元1,運算元2

示例:SUB     R0,R1,#256           ; R0 = R1 – 256


MUL指令(相乘)
格式:MUL{條件}{S} 目的暫存器,運算元1,運算元2

示例:MUL R0,R1,R2           ;R0 = R1 × R2

 

MLA指令(帶累加的相乘)
格式:MLA{條件}{S} 目的暫存器,運算元1,運算元2,運算元3

示例:MLA   R0,R1,R2,R3           ;R0 = R1 × R2 + R3


5AND指令(邏輯位與)

格式:AND{條件}{S}目的暫存器,運算元1,運算元2


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


指令示例:
AND R0,R0,#3         ;該指令保持R0的0、1位,其餘位清零。

 

類似邏輯運算指令:

ORR指令(邏輯位或)

格式:ORR{條件}{S} 目的暫存器,運算元1,運算元2

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

 

EOR指令(邏輯位異或)

格式:EOR{條件}{S} 目的暫存器,運算元1,運算元2

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


6LDR指令
格式: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。


7STR指令

格式:STR{條件}源暫存器,[儲存器地址]


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


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


8LSL(或ASL
格式:通用暫存器,LSL(或ASL) 運算元     


LSL(或ASL)可完成對通用暫存器中的內容進行邏輯(或算術)的左移操作,按運算元所指定的數量向左移位,低位用零來填充。 其中,運算元可以是通用暫存器,也可以是立即數(0~31)。
指令示例:
MOV   R0, R1, LSL#2          ;將R1中的內容左移兩位後傳送到R0 中。


9LSR

格式:通用暫存器,LSR 運算元     

 
LSR可完成對通用暫存器中的內容進行右移的操作,按運算元所指定的數量向右移位,左端用零來填充。其中,運算元可以 是通用暫存器,也可以是立即數(0~31)。


指令示例:
MOV   R0, R1, LSR #2         ;將R1中的內容右移兩位後傳送到R0 中,左端用零來填充。


10.條件語句

①CMP  R0,R1

BEQ  地址

*:如果R0、R1相等,跳到所給地址處執行,否則繼續執行下一句。

②CMP  R0,R1

BNE 地址

*:不相等

③CMP  R0,R1

BLE  地址

*:小於等於

④CMP  R0,R1

BGT  地址

*:大於


11.迴圈語句:

CMP  R0,R1

B條件  地址

*:所給地址在當前地址前面,即可迴圈執行所給地址到當前地址的語句。


 

相關文章