常用的arm彙編指令 1

2021-08-17 06:53:53 字數 2917 閱讀 7769

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

2.除此之外,還有反向減法指令rsb:rsb.w rd,rn, #imm12 ; rd = imm12-rn    rsb.w rd,rn, rm ; rd = rm-rn.cpsr:程式狀態暫存器(current program status register) cpsr在使用者級程式設計時用於儲存條件碼;cpsr包含條件碼標誌,中斷禁止位,當預處理器模式以及其他狀態和控制資訊。

3.備份程式狀態暫存器spsr(backups program statues register)。當特定的異常中斷發生時,spsr用於存放cpsr中的內容,在異常中斷處理完成後,可以用spsr中的內容來恢復cpsr。已達到保護並恢復中斷現場作用。spsr的格式與cpsr的格式完全相同。

4.b指令(branch)表示無條件跳轉,b main ;跳轉到標號為main地**處,bl指令(branch with link)表示帶返回值的跳轉. bl比b多做一步,在跳轉前,bl會把當前位置儲存在r14(即lr暫存器),當跳轉**結束後,用mov pc,lr指令跳回來,這實際上就是c語言執行函式的用法,彙編裡調子程式都用bl,執行完子函式後,可以用mov pc,lr跳回來。mvn r0, #0 ;把0取反(即-1)傳給r0。

5.ldr r0,[r1]; r1的值當成位址,再從這個位址裝入資料到r0 (r0=*r1)。ldr r1,=0x30008000 ; 把地0x30008000的值裝入到r1中,ldr中用常數要用=打頭.(注意跟mov的區別,mov是#)。 str(store) 用於把乙個暫存器的值存入外部儲存空間,是ldr的逆操作。str r0,[r1] ; 把r0的值,存入到r1對應位址空間上(*r1 = r0)。

6.adds r0,r1,r2; r0=r1+r2,adds中s表示把進製結果寫入cpsr,adc r5,r3,r4 ;r5=r3+r4+c。subs r0,r1,r2; r0=r1-r2,subs中s表示把進製結果寫入cpsr,sbc r5,r3,r4 ;r5=r3-r4-c

7.and位與指令 and r0,r1,#0xff ; r0=r1 & 0xff;  tst測試某一位是否為1,並把結果寫入cpsr,供下一句使用,tst r1,#0xffe;   等同於if(r1 & 0xffe);

8.bic清位操作bic   r0,r0,#%1011   ; 該指令清除 r0 中的位 0 1  3,其餘的位保持;   %表示是二進位制,0x表示十六進製制.

9.ldmia r0! , ;加r0指向的位址上連續空間的資料,儲存到r3-r9當中,!表示r0值更新,ia字尾表示按word遞增 ldmfd sp!,^;恢復現場,異常處理返回,^表示不允許在使用者模式下使用。

10.stm 從暫存器列表向儲存空間傳值。stmia r1!, ;將r3-r9的資料儲存到r1指向的位址上,r1值更新。stmfd sp!,; 現場儲存,將r0~r7,lr入棧

11.asr(算術右移),ror(迴圈右移)rrx帶擴充套件的迴圈右移。符號定義指令全域性變數定義 gbla ,gbll,gbls。局域變數定義 lcla,lcll,lcls。變數賦值seta,setl,sets其中上述偽指令中,最後面的a表示給乙個算術變數賦值,l表示用於給乙個邏輯變數賦值,s表示給乙個字串賦值。

12.space 定義乙個記憶體空間,並用0初始化。 dcb 定義乙個連續位元組記憶體空間,用偽指令的表示式expr來初始化.一般可以用定義資料**,或文字字串.(這時等同於sets),用於初始二進位制buffer。  dcu定義的一段字的記憶體空間(dcb是位元組),並用後面表示式初始化。

13.位元組對齊 align   定義乙個數字常量定義 equ。 宣告乙個外部符符號import,extern 向外部匯入乙個符號,一般是外部程式全域性變數。

r13:又叫sp(stack pointer),是棧頂指標

r14:又叫lr(link register),存放函式的返回位址。

r15:又叫pc(program counter),指向當前指令位址

------------------------------

r0,r1,r2,r3,在呼叫函式時,用來存放前4個函式引數和返回值,

r4-r11,r14,在呼叫函式時必須儲存這些暫存器到堆疊當中。如果函式的

引數多於4個,則多餘引數存放在堆疊當中,即sp,sp+4,sp+8,…依次類推。

teq r1,r2 ;將暫存器r1的值與暫存器r2的值按位異或,並根據結果設定cpsr的標誌位

tst運算元1, 運算元2意思:將暫存器與另外乙個暫存器的內容進行按位與的運算,根據結果更新cpsr中條件標誌位的值。它一般用來檢測是否設定了特定的位。

clz count left zero 計算運算元最高端0的個數,clz指令返回運算元二進位制編碼中第乙個1前0的個數。

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

指令示例:rsb r0,r1,r2 ; r0 = r2 – r1

14.stmfd sp!, ,   start_address = sp - 9 * 4 ,    end_address = sp - 4

把暫存器r0~r7和lr(r14)共9個暫存器,儲存到start_address開始, 到end_address結束的棧中,並且修改sp的值(sp變小),相當於壓棧。ldr r0,[r1,r2] ;將儲存器位址為r1+r2的字資料讀入暫存器r0。

dcd /dcdu:用於分配一片連續的字儲存單元並用指定的資料初始化。adrl: 將相對於程式或相對於暫存器的位址載入暫存器中。 與 adr 指令相似。adrl 生成兩個資料處理指令,因此它比 adr 載入的位址範圍要寬。

**:

ARM常用彙編指令

1 gbll 偽指令用於定義乙個全域性的邏輯變數,並初始化為。gbll bootloader bootloader setl 2 get 或 include get 偽指令用於將乙個原始檔包含到當前的原始檔中,並將被包含的原始檔在當前位置進行彙編處理。可以使用 include 代替 get。incl...

基礎常用arm彙編指令

ldr 目的暫存器 儲存器位址 作用 指令從記憶體中讀出資料到暫存器中 比如 ldr r1,r2,4 將位址r2 4的記憶體單元的資料讀取到r1中 ldr r1,r2 將位址r2的記憶體單元的資料讀取到r1中。r1 r2 注意 ldr中的第二個引數為 時,表示偽指令,或者表示記憶體訪問指令 比如 l...

ARM彙編指令

b或bl指令引起處理器轉移到 子程式名 也就是位址 處開始執行,這兩個指令都是相對跳轉指令。兩者的不同之處在於bl指令在轉移到子程式執行之前,將其下一條指令的位址拷貝到r14 lr,鏈結暫存器 由於bl指令儲存了下條指令的位址,因此使用指令 mov pc lr 即可實現子程式的返回。而b指令則無法實...