匯編初識
寄存器 與 內(nèi)存
寄存器:
1. sp寄存器:熱議時刻會保存棧底的地址镶殷。
2. fp寄存器:也稱為x29寄存器禾酱,屬于通用寄存器,在某些時刻我們利用它保存棧頂?shù)牡刂贰?3. x30寄存器:存放是函數(shù)的返回地址;當ret指令執(zhí)行時刻,會尋找x30寄存器保存的地址值绘趋。
4. 浮點寄存器:
D0 - D31(64位) 颤陶,S0 - S31存放的是低地址
S0 - S31(32位)
5. 向量寄存器 128位:V0-V31
6. 狀態(tài)寄存器CPSR(current program status register):
* CPSR的低8位(包括I、F陷遮、T和M[4:0])稱為控制位滓走,程序無法修改,除非CPU運行于特權(quán)模式下,程序才能修改控制位!
* N、Z拷呆、C闲坎、V均為條件碼標志位。它們的內(nèi)容可被算術或邏輯運算的結(jié)果所改變茬斧,并且可以決定某條指令是否被執(zhí)行!
狀態(tài)寄存器鏈接:http://www.reibang.com/p/9e0d8d6199e6
函數(shù)參數(shù):
1. 函數(shù)的參數(shù)存放位置:X0到X7(W0到W7)這8個寄存器里面腰懂,如果超過8個參數(shù),就會入棧。
2. 函數(shù)的局部變量存放位置:存放在棧里面项秉。
3. cup變量臨時存放位置:
ARM64绣溜,X0-X30, XZR(零寄存器) --- 64位
ARM64,W0-W30, WZR(零寄存器) --- 32位
8086娄蔼,CS,DS,SS,ES四個寄存器
注意點:
1怖喻、ARM64開始,取消32位的 LDM,STM,PUSH,POP指令! 取而代之的是ldr\ldp str\stp
2、ARM64里面 對棧的操作是16字節(jié)對齊的
st指令:
- stur指令岁诉,把寄存器的值(32位)寫進內(nèi)存
- stp/str指令锚沸,把寄存器的值(128位/64位)寫進內(nèi)存
ld指令:
- ldr指令,從內(nèi)存地址取一個單個的32位值
- dlp指令涕癣,從內(nèi)存地址取一個單個的64位值
bl指令:
- 將下一條指令的地址放入lr(x30)寄存器
- 轉(zhuǎn)到標號處執(zhí)行指令
ret指令:
- 在xcode中哗蜈,lr代表的是x30寄存器的值,通過底層指令提示CPU此處作為下條指令地址