ARM彙編筆記(1) 暫存器 常用指令

2021-08-09 09:49:46 字數 2101 閱讀 2794

1. 通用暫存器

r0 ~ r15

與編譯器有特殊約定的暫存器:

r13:別名sp,棧頂指標

(r9~r13都有約定,但還是sp最常用到)

psr暫存器(狀態暫存器):

n:運算結果為負

z:運算結果為零

c:運算發生進製

v:運算發生溢位

與後文cmp,s字尾和condition字尾相關

2. 常用指令

mov

mov r1, #5        ;r1 = 5
mov r1, r0       ;r1= r0
算術,邏輯指令

add r2, r0, r1      ;r2 = r0 + r1
ldr/str

ldr r1, [sp, #4]        ;r1 = memory[sp + 4]
str r1, [sp, #4]        ;memory[sp + 4] = r1
ldmxx/stmxx

該系列指令能夠一次load/store多個暫存器,xx表示該系列指令的字尾,一般格式為:

[ldm|stm][d|i][b|a] 基址暫存器[!],
字尾所表達的意思

db: decrease before,表示從基址開始,對於列表中每個暫存器,位址減4而後load/store該暫存器值

da: decrease after,表示從基址開始,對於列表中每個暫存器,load/store該暫存器值而後位址減4

ib: increase before,表示從基址開始,對於列表中每個暫存器,位址加4而後load/store該暫存器值

ia: increase after, 表示從基址開始,對於列表中每個暫存器,load/store該暫存器值而後位址加4

!: 加上嘆號表示同步改變基址暫存器的值

push/pop

操作sp的指令別名,其實就是s***b sp!和ldmia sp!,主要在傳遞引數,儲存/恢復暫存器上下文等情景下使用

push          ;相當於s***b sp!,
pop           ;相當於ldmia sp!,
b/bl/bx/blx

b label       ;跳轉至label
bl lable      ;跳轉至label並鏈結,相當於先「mov lr, pc」再「b label」
bx r1         ;以r1的值為目標位址進行跳轉

cmp,s字尾和condition字尾

cmp指令和帶s字尾的算術和邏輯指令會根據結果改變psr的對應位,這樣之後帶有condition字尾的指令就可以根據情況來選擇是否執行,例如:

int test(int a, int b)
會被編譯為:

cmp    r0, #0        ;等價於subs r0, #0

addge r0, r0, r1

rsblt r0, r1, r0

bx lr

condition字尾包括eq(相等),ne(不等),lt(小於),gt(大於),le(小於等於),ge(大於等於)。

對於跳轉指令來說,可以通過加入condition字尾來實現程式的分支和迴圈等控制邏輯。

注意thumb狀態下只有跳轉指令可以帶condition字尾。

總結

本文記錄的指令只是arm指令集中極小的乙個子集,但已經能夠滿足大部分程式設計以及檢視彙編**的需求。

彙編暫存器,mov指令 2021 3 13

即 ax,bx,cx,dx,sp,bp,si,di,ip,flag,cs,ds,ss,es 共 14 個。而這 14 個暫存器按照一定方式又分為了通用暫存器,控制暫存器和段暫存器。通用暫存器 ax,bx,cx,dx 稱作為資料暫存器 ax accumulator 累加暫存器,也稱之為累加器 cx c...

彙編學習 暫存器1

典型的cpu由運算器 控制器 暫存器等器件構成,這些器件靠內部匯流排進行資訊傳送。匯流排分為內部匯流排和外部匯流排,內部匯流排實現cpu內部各個器件的聯絡,外部匯流排實現cpu和主機板上其他器件的聯絡 程式設計師通過改變各種暫存器的內容來實現對cpu的控制 在進行資料傳送或運算時,要注意指令的兩個操...

ARM彙編中PC暫存器詳解

近日,在研究一些開源native層hook方案的實現方式,並據此對arm彙編層中容易出問題的一些地方做了整理,以便後來人能有從中有所收穫並應用於現實問題中。當然,文中許多介紹參考了許多零散的文章,本文重點工作在於對相關概念的整理收集,並按相對合理順序引出後文中對hook技術中的一些難點的解讀。and...