ARM組合語言最常用指令
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大指令。
1、BL指令
格式:BL{條件}目標地址
用法:BL是另一個跳轉指令,但跳轉之前,會在暫存器R14中儲存PC的當前內容,因此,可以通過將R14的內容重新載入到PC中,來返回到跳轉指令之後的那個指令處執行。該指令是實現子程式呼叫的一個基本但常用的手段。
指令示例:
BL Label ;當程式無條件跳轉到標號Label處執行時,同時將當前的 PC值儲存到R14(LR)中
2、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
3、CMP指令(比較)
格式:CMP{條件}運算元1,運算元2
CMP指令用於把一個暫存器的內容和另一個暫存器的內容或立即數進行比較,同時更新CPSR中條件標誌位的值。該指令進行一次減法運算,但不儲存結果,只更改條件標誌位。 標誌位表示的是運算元1與運算元2的關係(大、小、相等),例如,當運算元1大於操作運算元2,則此後的有GT字尾的指令將可以執行。
指令示例:
CMP R1,R0 ;將暫存器R1的值與暫存器R0的值相減,並根據 結果設定CPSR的標誌位
CMP R1,#100 ;將暫存器R1的值與立即數100相減,並根 據結果設定CPSR的標誌位
4、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)
類似算數指令:
①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
5、AND指令(邏輯位與)
格式: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位,其餘位保持不變。
6、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。
7、STR指令
格式:STR{條件}源暫存器,[儲存器地址]
STR指令用於從源暫存器中將一個32位的字資料傳送到儲存器中。 該指令在程式設計中比較常用,且定址方式靈活多樣,使用方式可參考指令LDR。
指令示例:
STR R0,[R1],#8 ;將R0中的字資料寫入以R1為地址的儲存器中,並 將新地址R1+8寫入R1。
STR R0,[R1,#8] ;將R0中的字資料寫入以R1+8為地址的儲存器中。
8、LSL(或ASL)
格式:通用暫存器,LSL(或ASL) 運算元
LSL(或ASL)可完成對通用暫存器中的內容進行邏輯(或算術)的左移操作,按運算元所指定的數量向左移位,低位用零來填充。 其中,運算元可以是通用暫存器,也可以是立即數(0~31)。
指令示例:
MOV R0, R1, LSL#2 ;將R1中的內容左移兩位後傳送到R0 中。
9、LSR
格式:通用暫存器,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條件 地址
*:所給地址在當前地址前面,即可迴圈執行所給地址到當前地址的語句。
相關文章
- lec 02 arm組合語言基礎組合語言
- 組合語言-CALL和RET指令組合語言
- 機器碼 指令 組合語言 的關係機器碼組合語言
- 組合語言1 - 什麼是組合語言?組合語言
- 組合語言組合語言
- 組合語言 1組合語言
- 組合語言 2組合語言
- 組合語言-棧組合語言
- Go 語言的組合之道Go
- 組合語言---判斷字元組合語言字元
- 組合語言——更多功能組合語言
- 組合語言-基礎功能組合語言
- 8086執行組合語言組合語言
- 組合語言--單步中斷組合語言
- 組合語言-基礎知識組合語言
- [053][組合語言]adc 帶進位加法 sbb帶進位減法指令組合語言
- nand2tetris_hack組合語言NaN組合語言
- 組合語言-學習記錄(二)組合語言
- 基於MDK建立純組合語言--組合語言
- Python語言合併列表元素常用的方法!Python
- 智慧合約從入門到精通:Solidity組合語言Solid組合語言
- 哪種程式語言最適合產品經理?
- 深入iOS系統底層之組合語言iOS組合語言
- 【看雪課程】組合語言,開課啦!組合語言
- 組合語言-實驗10編寫子程式組合語言
- 組合語言實驗1—Debug基礎操作組合語言
- ARM下C語言棧幀機制C語言
- 組合語言 - 在Mac上執行 DEBUG.exe組合語言Mac
- 從組合語言到類庫框架的隨感組合語言框架
- 《組合語言》第十二章 內中斷組合語言
- Python屬不屬於組合語言?Python課程Python組合語言
- 比特幣指令碼語言比特幣指令碼
- 微機原理與系統設計筆記4 | 組合語言程式設計與其他指令筆記組合語言程式設計
- 理解函數語言程式設計語言中的組合--前言(一)函數程式設計
- [048][組合語言]實驗10 3、數值顯示組合語言
- 讀書筆記:組合語言(王爽)實驗七筆記組合語言
- 指令碼語言怎麼理解指令碼
- javascript是指令碼語言嗎JavaScript指令碼
- C語言常用函式C語言函式