ARM64 汇编快速查阅表 – 持续更新…
常用寄存器
FP(x29) 寄存器:64bit 栈底地址 通用寄存器
LR(x30) 寄存器:64bit 程序链接寄存器,保存了当前程序执行完毕后返回的地址
SP寄存器:64bit 栈顶地址 专用寄存器
w0寄存器:x0寄存器的低32位(以此类推)
wzr寄存器:32位清零寄存器
常用指令
伪操作命令
伪操作命令不是一个真正的命令,一般是在汇编代码中做标识符。例如对静态数据段中的数据类型进行描述
dd命令: 双字型,即4个字节。
dq命令: 4字型,即8个字节。
mov 指令
把右操作数或者右寄存器内的值存入左侧寄存器内
mov w9, #0x3ffmov w9, x8
str 指令
存储指令:将某个寄存器内的32位的值存到存储器中
str x0, [x1], #0x8; 将x0中的4字节写入x1指向地址的存储器内,并将(x1 + 0x8)这个新地址写入 x1str x0, [x1, #0x8]; 将x0中的4字节写入(x1 + 0x8)指向地址的存储器内
stur 指令
存储指令:将某个寄存器内的内容存储到右边的地址中
C++ 局部变量定义
1 | mov w11, #0x3 |
ldr/ldur 指令
加载指令:将右边的地址中的值取出来放在左侧的寄存器内
ldr 的地址偏移值为正值,ldur 的地址偏移值为负值
ldr w8, [x9]ldur x9, [x29, #-0x20]
sub 指令
减法指令:
sub x0, x1, x2 ; 将寄存器 x1 和 x2 的值相减后保存到寄存器 x0 中
stp 指令
入栈指令:(str 指令的变种,可以同时操作两个寄存器)
stp x29, x30, [sp x10]; 将 x29, x30 的值存入 sp 偏移 16 个字节的位置
adrp 指令
PC寄存器偏移指令:将pc寄存器和立即数按照规则计算后将值赋值给另一个寄存器
adrp x8, #0x10011000; 将PC寄存器的16进制的值,后三位清零后,加上立即数左移3位后的值,赋值给x8寄存器。
Q&A
FP/SP 寄存器
FP是一个通用寄存器,在「某些时刻」会保存栈底的地址。而SP是一个专用寄存器,它在任何时刻保存的都是当前栈的栈顶位置。