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...