arm64,4字节定长指令系统。
寄存器
x0-x30 通用寄存器,32bit使用:WO-W30
FP(x29) 保存栈帧地址(栈底指针)
LR(x30) 程序链接寄存器,保存子程序结束后需要执行的下一条指令
SP 保存栈指针,SP/WSP
PC 程序计数器,在arm64中,软件不能改写PC寄存器
CPSR 状态寄存器
V0 – V31 向量寄存器,也可以说是浮点型寄存器。每个寄存器128位的。
可以用Bn Hn Sn Dn Qn。基于一个word是32位,也就是4Byte大小:
Bn: Byte. 8位
Hn: half word. 16位
Sn: single word. 32位
Dn: double word. 64位
Qn: quad word. 128位
调用栈
栈是从高地址到低地址。
fp指向当前frame的栈底,高地址。
sp指向栈顶,低地址。
栈结构:
fp
.
.
.
lr
fp
.
.
.
lr
fp
.
.
.
backtrace原理:
从fp一直往上找,记录挨着的lr,直到fp为0。
ABI
对于arm64:
x0–x7存放前8个参数,多余的参数会存在栈上。
返回值一般都在x0。
如果返回较大的数据结构,存在x8地址上。
对于x64:
分别用rdi,rsi,rdx,rcx,r8,r9作为第1-6个参数,rax作为返回值。
总之,arm32/arm64/x86/x64的调用约定各不一样,x86用堆栈传参,x64用寄存器传参,等等。
arm32还有个Thumb指令系统,Thumb指令是缩减的16位指令,存储占用小,但在32存储器上效率没4字节的arm指令集高。Thumb子程序和arm子程序可以互相调用,处理器可在执行Thumb程序段的状态和执行arm程序段的状态间切换。
指令格式/各类指令/各类寻址方式
比如条件域、寻址移位、叹号,等。
mov{条件域}{s} 目的寄存器,源操作数
s选项决定是否影响CPSR中条件标志位的值。
ld... -> load到寄存器
st... -> store到内存
有叹号,表示移动数据后,并更新地址。
伪操作/伪指令/汇编文件格式/子程序调用/和C语言互调/汇编宏
略。
参考
-
ARM64 汇编——寄存器和指令
https://www.jianshu.com/p/2f4a5f74ac7a -
iOS开发同学的arm64汇编入门
https://blog.cnbluebox.com/blog/2017/07/24/arm64-start/ -
ARMv8中branch指令分类、格式及用法
https://blog.youkuaiyun.com/qianlong4526888/article/details/8247219 -
ARMv8-A Architecture – ARM
https://developer.arm.com/architectures -
iOS ABI Function Call Guide
https://developer.apple.com/library/archive/documentation/Xcode/Conceptual/iPhoneOSABIReference/Introduction/Introduction.html
https://courses.cs.washington.edu/courses/cse469/18wi/Materials/arm64.pdf