一、暫存器和定址
arm有16個暫存器,r0-r15
pc r15
lr r14
sp r13
ip r12
(push sp減少,pop sp增加)
1.定址方式
從操作位址尋找運算元的方式
2.arm的定址方式
a 暫存器定址, 運算元在暫存器中
b 立即定址,運算元就在指令中
subs r0,r0,#1
;r0-1->r0
mov r0,#0xff00
c. 暫存器偏移定址
mov r0,r2,lsl #3
r2左移三位
d. 暫存器間接定址
運算元的位址在暫存器中
e. 基址定址
運算元的位址在暫存器中,不過要加乙個偏移量
str r1,[r2,#-2]
f. 多暫存器定址
ldmia l->到別人
stmia s別人到自己
g. 堆疊定址
stmid
ldmfd
h. 塊拷貝
stmia
stmib
s***a
s***b
i. 相對定址
位址=pc+偏移
二、指令指令
1、跳轉指令
b 跳轉指令
bl 帶返回的跳轉指令
blx 帶返回和狀態切換的跳轉指令
bx 帶狀態切換的跳轉指令
b、bl都可以跳轉到指令的目標位址,b僅僅執行跳轉,bl指令還把pc暫存器的值儲存到lr暫存器。
2、資料處理指令
mov 資料傳送指令
mvn 資料求反傳送指令
cmp 比較指令
cmn 基於相反數的比較指令
tst 位測試指令
teq 相等測試指令
add 加法
sub 劍法指令
rsb 逆向減法指令
adc 帶位加法指令
sbc 帶位減法指令
rsc 帶位逆向減法指令
and 邏輯與操作
ric 位清除指令
eor 邏輯異或操作指令
orr 邏輯或操作指令
三、狀態暫存器和其他
31 30 29 28 27
n z c v q
r0-r8 無備份、r8-r14有備份
fp(r11)指向當前棧幀的開始,sp(r13)指向當前棧幀的結束
pc(r15)指向當前指令的位置
ip(r12)可以作為偏移位址,和某些東西一起計算出下乙個pc的位址,也可以用來儲存臨時變數
lr (r14)返回的位址,返回值在r0
r0 this?
fp棧低 ,最先儲存的位置,高位址 r11
sp棧頂 ,最後儲存的位置,低位址 r13
str 儲存,把暫存器的儲存起來。從彙編來看,從左到右
load 載入,把暫存器的載入起來。從彙編來看,從右到左
objdump -c -d
ldrh 載入無符號半字資料 只載入低2位元組資料
ARM彙編學習
前言 任何彙編行都是如下結構 comment 注釋 gnu arm 彙編中,任何以冒號結尾的都被認為是乙個標籤,而不一定非要在一行的開始。下面是乙個簡單的例子,這段匯程式設計序定義了乙個 add 的函式,該函式返回兩個引數的和 section text,x global add give the s...
ARM彙編學習
前言 任何彙編行都是如下結構 comment 注釋 gnu arm 彙編中,任何以冒號結尾的都被認為是乙個標籤,而不一定非要在一行的開始。下面是乙個簡單的例子,這段匯程式設計序定義了乙個 add 的函式,該函式返回兩個引數的和 section text,x global add give the s...
ARM彙編學習 1
global關鍵字用來讓乙個符號對鏈結器可見,可以供其他鏈結物件模組使用 告訴編譯器後續跟的是乙個全域性可見的名字 可能是變數,也可以是函式名 global start 讓 start 符號成為可見的識別符號,這樣鏈結器就知道跳轉到程式中的什麼地方並開始執行。start是乙個函式的起始位址,也是編譯...