概念
一弧呐、寄存器
1.數(shù)據(jù)地址寄存器
通常用來做數(shù)據(jù)計算的臨時存儲管引、累加士败、計數(shù)、地址保存等功能褥伴。定義這些寄存器的作用主要用于在CPU指令保存操作數(shù)拱烁,在CPU中當作常規(guī)變量來使用。
ARM64中
- 64位:X0 - X30噩翠, XZR(零寄存器)
- 32位:W0 - W30, WZR(零寄存器)是64位寄存器的低32位部分邦投,并不是獨立存在的
2.浮點和向量寄存器
因為浮點數(shù)存儲以及運算的特殊性伤锚,CPU中專門提供浮點寄存器來處理浮點數(shù)
- 浮點寄存器 64位:D0 - D31 32位:S0 - S31
現(xiàn)在CPU支持向量運算(在圖形處理相關領域用的非常多)為了支持向量計算,系統(tǒng)也提供了眾多向量寄存器
- 向量寄存器 128位:V0 - V31
3.SP和FP寄存器
- SP寄存器在任意時刻會保存棧頂?shù)刂?/li>
- FP寄存器也稱X29寄存器志衣,屬于通用寄存器屯援,但某些時刻用來保存棧底地址
注:ARM64中,對棧的操作是16字節(jié)對齊的
4.X30寄存器
- 存放的是函數(shù)的返回地址念脯,當ret指令執(zhí)行時刻狞洋,尋找X30保存的地址值
二、棧
棧是一種具有特殊訪問方式的存儲空間(后進先出绿店,Last In Out First吉懊,LIFO)
三庐橙、指令
str(store register) -> 變種stp(可以操作兩個寄存器)
將數(shù)據(jù)從寄存器中讀出來,存到內(nèi)存中
ldr(load register) -> 變種ldp(可以操作兩個寄存器)
將數(shù)據(jù)從內(nèi)存中讀出來借嗽,存到寄存器中
bl
將下一條指令地址放入lr(X30)寄存器
跳轉(zhuǎn)到標號處執(zhí)行指令
ret
默認使用lr(X30)寄存器的值态鳖,通過底層指令提示CPU此處作為下條指令地址
ARM64的特色指令,它面向硬件做了優(yōu)化處理
四恶导、函數(shù)的參數(shù)與返回值
ARM64下浆竭,函數(shù)的參數(shù)是存放在X0 - X7(W0 - W7)這8個寄存器中,如果超過8個參數(shù)惨寿,則會入棧
函數(shù)的返回值放在X0寄存器中
五邦泄、函數(shù)的局部變量
函數(shù)局部變量放在棧里
六、實踐
-
新建demo裂垦,添加匯編文件顺囊,匯編代碼
添加匯編文件.png
- 編寫匯編代碼
.text
.global _A // 全局函數(shù)
_A:
sub sp, sp, #0x20 // 將sp減#0x20(向低地址拉伸棧空間32個字節(jié))
stp x0, x1, [sp, #0x10] // stp:操作兩個寄存器缸废,將x0,x1放入內(nèi)存 [sp, #0x10]:sp加上#0x10
ldp x1, x0, [sp, #0x10] // ldp:操作兩個寄存器包蓝,將sp內(nèi)容寫入寄存器,交換
add sp, sp, #0x20 // 棧平衡企量,如果不處理测萎,造成內(nèi)存不夠用,函數(shù)調(diào)用完不要了
ret
-
main中調(diào)用A函數(shù)届巩,設置斷點
調(diào)用函數(shù).png
2.運行查看寄存器
-
查看寄存器
選擇查看寄存器.png -
sp初始地址
sp初始地址.png -
進入函數(shù)硅瞧,單步走
sp從高地址往下拉伸32個字節(jié).png -
初始x0, x1中的值
初始x0, x1中的值.png -
單步走,x0, x1中的值進行了交換
x0, x1實現(xiàn)交換.png -
CMD + Shift + M 查看寄存器變化
查看寄存器變化.png
lldb:
單步執(zhí)行:ni
寫寄存器:register write x0 0xffffffff
讀寄存器:register read x0