本文將我遇到的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