關于arm64匯編指令,如下圖
匯編指令.png
匯編指令可以匯總如下:(后續會更新)
匯編指令.png
關于內存讀寫指令
注意:讀/寫 數據是都是往高地址讀/寫
str(store register)指令
將數據從寄存器( Stack Register)中讀出來,存到內存中.
ldr(load register)指令
將數據從內存中讀出來,存到寄存器( Stack Register)中
此ldr 和 str 的變種ldp 和 stp 還可以操作2個寄存器.
bl指令
跳轉
bl指令
CPU從何處執行指令是由pc中的內容決定的,我們可以通過改變pc的內容來控制CPU執行目標指令
-
ARM64提供了一個mov指令(傳送指令),可以用來修改大部分寄存器的值,比如
- mov x0,#10、mov x1,#20
但是,mov指令不能用于設置pc的值,ARM64沒有提供這樣的功能
ARM64提供了另外的指令來修改PC的值,這些指令統稱為轉移指令,最簡單的是bl指令
bl指令 -- 練習
現在有兩段代碼!假設程序先執行A,請寫出指令執行順序.最終寄存器x0的值是多少?
_A:
mov x0,#0xa0
mov x1,#0x00
add x1, x0, #0x14
mov x0,x1
bl _B
mov x0,#0x0
ret
_B:
add x0, x0, #0x10
ret
bl和ret指令
bl標號
- 將下一條指令的地址放入lr(x30)寄存器
- 轉到標號處執行指令
ret
- 默認使用lr(x30)寄存器的值,通過底層指令提示CPU此處作為下條指令地址!
ARM64平臺的特色指令,它面向硬件做了優化處理的
adrp指令
是計算指定的數據地址 到當前PC值的相對偏移
由于得到的結果是低12bit為0
舉例:adrp x0,1
1、將1的值左移12位 1,0000,0000,0000 == 0x1000
2、將PC寄存器的低12位清零 比如: 0x1002e6123 ==> 0x1002e6000
3、將步驟1和2的值相加的結果 給 X0寄存器!!0x1002e7000
尋找常量的地址經常會用到這個指令
haha.png
x30寄存器
x30寄存器存放的是函數的返回地址.當ret指令執行時刻,會尋找x30寄存器保存的地址值!
注意:在函數嵌套調用的時候.需要講x30入棧!