学汇编最主要的是要搞懂:寄存器,指令和堆栈三个方面。
iPhone5S后,苹果都采用ARM64架构。
本文主要介绍ARM64汇编寄存器和常用指令集。
寄存器
ARM64架构中共有34个寄存器,包括31个通用寄存器、SP、PC、CPSR。
-
R0-R30通用寄存器
每个寄存器最多可以存取一个64位大小的数。以x0-x30形式使用时是64位的,以w0-w30形式使用时是32位的。
其中,R0-R7作为函数的参数,R0保存函数的返回值
其中,R8寄存器用来保存子程序的返回值
其中,R29又称FP寄存器(frame point),主要用来保存栈帧(栈底)指针;
其中,R30又称LR寄存器(link register),主要用来保存函数返回地址
-
SP:栈顶指针
-
PC:类似于8086汇编中的IP寄存器,用来记录当前执行的指令地址
-
CPSR:状态寄存器,用来标记运算各种标记
指令集
-
MOV 指令
mov x0, x1:把寄存器r1的值赋给寄存器r0
mov w0, #0x1122:把0x1122写进r1的低16位
movk w0, #0x3344, lsl #16:0x3344作为w0的16-32位值
-
ADD 加法指令
ADD{条件}{S} 目的寄存器,操作数 1,操作数 2;指令用于把两个操作数相加,并将结果存放到目的寄存器中
ADD x0,x1,x2: x0 = x1 + x2
ADD x0,x1,#256:x0 = x1 + 256
ADD x0,x2,x3,LSL#1:x0 = x2 + x3<<1 -
SUB 减法指令
SUB{条件}{S} 目的寄存器,操作数 1,操作数 2
-
AND 逻辑与指令
AND{条件}{S} 目的寄存器,操作数 1,操作数 2
-
ORR 逻辑或指令
ORR{条件}{S} 目的寄存器,操作数 1,操作数 2
-
EOR 逻辑异或指令
ORR{条件}{S} 目的寄存器,操作数 1,操作数 2
-
LDR 存储器到寄存器的数据传输指令
LDR{条件} 目的寄存器,<存储器地址>
-
STR 寄存器到存储器的数据传输指令
STR{条件} 源寄存器,<存储器地址>
-
LDP 存储器连续读两个单元到两个寄存器
LDP 寄存器1, 寄存器2,<存储器地址>
-
STP 把两个寄存器的值连续放在某个内存地址后
STP 寄存器1, 寄存器2,<存储器地址>
-
CMP 比较指令
CMP{条件} 操作数 1,操作数 2
CMP 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新 CPSR 中
条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是 操作数 1 与操作数 2 的关系(大、小、相等) 。
-
B 跳转指令
把要跳转的指令地址赋给PC寄存器
-
BL带返回地址的跳转指令
把要跳转的指令地址赋给PC寄存器,同时把下一个指令地址(返回地址)赋给LR寄存器
-
RET 子程序退出返回指令
在后面学习中有遇到其他指令会更新
网友评论