1. 單暫存器載入指令(ldr)
ldr r0, [r1] r0
載入字指令:ldr r0, [r1],將記憶體中的乙個字(4個位元組)載入到暫存器r0中
載入位元組指令:ldrb r0, [r1],將記憶體中的乙個位元組載入到暫存器r0中
有符號數載入位元組指令:ldrsb r0, [r1],這條指令與上一條指令的不同之處在於,由於載入的是乙個位元組,而不是乙個字,所以需要確定暫存器r0的高24bit是什麼。對於上一條指令,r0的高24bit補0,而本條指令,r0的高24bit補符號位,也就是補r0的bit7
2. 單暫存器儲存指令(str)
str r0, [r1] r0 **********> [r1] 存資料
3. 多暫存器儲存指令(stm)
資料的儲存與讀取:ia、ib、da、db
stmia 完成操作後位址遞增
stmib 位址先遞增而後完成操作
s***a 完成操作後位址遞減
s***b 位址先遞減再完成操作
用於堆疊操作 fa、ea、fd、ed
stmfa 滿遞增堆疊
stmea 空遞增堆疊
stmfd 滿遞減堆疊
stmed 空遞減堆疊
4. 多暫存器載入指令(ldm)
資料的儲存與讀取:ia、ib、da、db
ldmia 完成操作後位址遞增
ldmib 位址先遞增而後完成操作
ldmda 完成操作後位址遞減
ldmdb 位址先遞減再完成操作
滿堆疊:堆疊指標指向最後壓入棧的有效資料項,每次存入時需要先移動棧指標再存入;取出時先取出,然後再移動棧指標。
s***b r13!, r13
壓棧操作,將r12-r10指向的位址對應的記憶體中的內容,存入到r13中,r13每存乙個位址遞減一次。arm棧向下增長
ldmia r13!, r13 *****====》r2-r10,pc
出棧操作,將r13指向的位址對應的記憶體的內容存入r2,然後r13位址遞增,再r13遞增後指向的位址對應的記憶體的內容放入r3,以此類推。arm出棧向上增長
使用資料塊傳送指令進行堆疊操作
s***a r0!, 將r5、r6存入相應的r0指向的位址對應的記憶體
ldmib r0!, 將r0指向的位址對應的記憶體的內容存入r5和r6
使用堆疊指令進行堆疊操作
stmed r13!, 空遞減堆疊,棧指標指向的位置沒有資料,寫入資料後,棧指標向減小的方向移動。
tmia, 比如當前r0指向的記憶體位址是 0x1000,stmia r0!, 就是 首先把r1存入 0x1000,然後r2存入0x1004,然後r3存入0x1008,如果是32位的處理器就是每次加4個位元組,以此類推把 r1-r7按照遞增的位址存入,這個r0!就是從r0的位址開始存的意思。s***b則是位址從r0開始減少,依次儲存
資料的儲存與讀取:ia、ib、da、db
ldmed
ldmfd
ldmea
ldmfa
可以發現:
表1 資料搬運條件助記符
模式說明
模式說明
ia每次傳送後位址加4
fd滿遞減堆疊
ib每次傳送前位址加4
ed空遞減堆疊
da每次傳送後位址減4
fa滿遞增堆疊
db每次傳送前位址減4
ea空遞增堆疊
資料塊傳送操作
堆疊操作
5. 分支指令,共3條:b、bl、bx
特別說明:
b和bl指令,其跳轉範圍限制在當前指令的±32m位元組位址內(arm指令為字對齊,最低2位位址固定為0)。
6. 資料處理指令
movr0, r1:將r1的值賦給r0;
add(sub) r0, r1, r2:將r1的值加上(減去)r2的值,結果存放到r0中;
and(orr, eor) r0, r1, r2:將r1的值與(或、異或)r2的值,結果存放到r0中;
cmpr1, r2:比較r1與r2值的大小;
特別需要說明的問題:
指令cmp r1,r2,其執行細節是:執行r1 - r2的操作,如果結果為負數,則置位cpsr的n位,清零z位;結果為0,則清零cpsr的n位,置位z位;結果為正,則清零cpsr的n位,清零z位。但r1-r2的結果並不儲存。cmp指令通常用於分支跳轉。例如,如下的c程式
int i,j;
if (i = = j) else
如果使用彙編語句改寫的話,就應該寫為:
使用ldr指令將變數i的值放入r0
使用ldr指令將變數j的值放入r1
cmp r0, r1
addeq r0, r0, #1
使用streq指令將r0的值放入變數i中
beq label
add r1, r1, #1
使用str指令將r1的值放入變數j中
label 其它**
其中addeq, streq, beq這幾條指令,是add, str, b指令的條件執行版本。講到這裡就不得不講解一下什麼是條件執行了。arm指令集的所有指令均支援條件執行,條件執行指的是,指令可以根據自己即將被執行時的情況(cpsr的條件**標誌位)決定自身是否被執行。eq表示如果cpsr的z位為1(對於本程式,實際上就是r0的值與r1的值相等,因為cmp會根據 r0與r1的值設定z位)的情況下,該指令要執行,否則不執行。
其它條件助記符如下:
表2 條件助記符
條件助記符
標誌含義
eqz=1
相等ne
z=0不相等
cs/hs
c=1無符號數大於或等於
cc/lo
c=0無符號數小於
min=1
負數pl
n=0正數或零
vsv=1
溢位vc
v=0沒有溢位
hic=1,z=0
無符號數大於
lsc=0,z=1
無符號數小於或等於
gen=v
有符號數大於或等於
ltn!=v
有符號數小於
gtz=0,n=v
有符號數大於
lez=1,n!=v
有符號數小於或等於
al任何
無條件執行 (指令預設條件)
nv任何
從不執行(不要使用)
ARM常用彙編指令
1 gbll 偽指令用於定義乙個全域性的邏輯變數,並初始化為。gbll bootloader bootloader setl 2 get 或 include get 偽指令用於將乙個原始檔包含到當前的原始檔中,並將被包含的原始檔在當前位置進行彙編處理。可以使用 include 代替 get。incl...
ARM架構常用彙編指令
博主自己的學習筆記,順便分享。不是教科書,有錯誤很正常,請指出,日後會修改。str r0,r1 r1是位址,將r0資料存放到r1指向的位址 str r0,r1,0x10 將r0資料寫入以r1 0x10為位址的儲存器中,r1不變 str r0,r1 0x10 將r0資料寫入以r1 0x10為位址的儲存...
ARM常用彙編指令介紹
b 跳轉指令 跳轉範圍為32mb pc 暫存器r15,程式計數器指向當前執行的程式位址 ldr 從記憶體中讀取資料載入到暫存器中 str 將暫存器中的資料儲存到記憶體 mov 暫存器與暫存器之間的資料傳送指令,也可以將立即數傳給目標暫存器 add 加法指令 sub 減法指令 bic 位清除指令 or...