ARM 彙編指令

 

本文將我遇到的ARM彙編指令用法及其用例記錄,邊用邊學,也能當做自己的手冊使用。可能稍顯粗糙,待後續更新調整。


一條ARM指令長度爲32bits

LDR(load) :讀內存   

LDR R0,[R1]          //將R1地址的數據讀取存儲到R0

LDR R0,=0x12345678   //僞指令,爲被拆分爲幾條真正的ARM指令(因爲每一條指令都是固定長度)

 

LDM(load many):讀內存,寫入多個寄存器

//與IA、IB、DB、DA後綴使用
//IA:increase after    DB:decrease before
//IB:increase before    DA:decrease after
//一般多與DB連用居多,用來做寄存器入棧保存
STMDB	sp!, {fp, ip, lr, pc}  //此處SP做decrease操作實際上是對sp的tmp操作
                               //對SP寄存器沒有做寫操作,加上!表示最後的tmp賦值到sp

 

STR(store):寫內存

STR R0,[R1]    //將R0值存儲到R1地址內存(4Bytes)

 

STM(store many):把多個寄存器的值寫入內存中

//後綴詳見STRM指令處
//一般多與IA連用居多,用來做寄存器出棧恢復
LDMIA	sp, {fp, sp, pc}       //此處sp後未加!,則sp的值爲棧中值賦值給{}中的sp完成賦值

 

STREQ:相等則寫內存(用法和STR一樣)

//一般與CMP等比較指令連用,判斷程序狀態寄存器(R15/PC)中的Z bit,爲1即相等則執行
STREQ R0,=1234

 

B:跳轉

B main

 

BL:跳轉,並把返回地址保存到LR寄存器中

BL main

 

MOV :賦值 

MOV R0,R1        //把R1的值賦值給R0

MOV R0,#0x10     //把立即數0x10賦值給R0

 

MOVEQ:相等則賦值

//一般與CMP等比較指令連用,判斷程序狀態寄存器(R15/PC)中的Z bit,爲1即相等則執行
MOVEQ R0,#10

 

BIC:位清零

//最後一個操作數的某位上爲1,則第二個操作數對應位清0,最終結果賦值給第一個操作數
bic	r3, r3, #16128  //0x3f00 

 

CMP:比較指令

//將兩個寄存器值做差(R1-R2),同時影響程序狀態寄存器(R15/PC)中的狀態位
CMP R1,R2

 

ADD:加法指令

add r0,r1,#4	//r0 =r1 + 4
add r0,r1,r2	//r0 =r1 + r2

 

SUB:減法指令

sub r0,r1,#4	//r0 =r1 - 4
sub r0,r1,r2	//r0 =r1 - r2

 

MVN:按位取反後賦值

MVN R0,R1
MVN R0, #4     //R0 = -5
MVN R0, #0     //R0 = -1

 

 


ARM彙編程序格式:

.text 

.global _start

_start:



halt:

    b halt
發佈了13 篇原創文章 · 獲贊 7 · 訪問量 6058
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章