Arm64汇编记录

相关指令记录

ARDP

ADRP <reg> <imm>

  1. 从PC相对地址到4KB页添加一个直接值
  2. 将当前pc地址低12位置零, 并加上立即数左移12位后的值

例子:

1
2
3
4
5
6
7
8
PC        = 0xe7b27341c7b0
reg = x16
imm = 866

; adrp x16, 866

x16 = (0xe7b27341c7b0 & (~0xFFF)) + (866 << 12)
= 0xe7b27377e000

CBZ

CBZ <reg> <imm>

  1. 将寄存器的值与0比较, 如过相等则跳转到相对pc +/-1MB的位置

例子:

1
2
3
4
5
6
7
reg =  x0
imm = 0xe7b273333c84

; cbz x0, 0xe7b273333c84

if (x0 == 0 ) goto 0xe7b273333c84
...continue

XZR

用于64位(8字节)置零操做

例子:

1
2
3
4
; 将x20寄存器置零
; mov x20, xzr

x20 = 0

LDP

LDP <reg1>, <reg2>, [reg3], <imm>

  1. reg3地址里面的值加载到reg1reg2
  2. 然后更新reg3的值, reg3 += imm

例子:

1
2
3
4
5
6
7
8
9
sp = uint64[]{ 2, 3 }

; ldp, x0, x1, [sp], #0x10

x0 = *sp
= 2
x1 = *(sp + 8)
= 3
sp = sp + 16

STP

STP <reg1>, <reg2>, [reg3, imm]!

  1. reg1,reg2中的值存入 reg3 + imm的地址里面, 并更新 reg3的值 reg3 += imm

例子:

1
2
3
4
5
6
7
8
9
10
x1 = 1
x2 = 2

; stp x1, x2, [sp, #-10]!

*(sp - 16) = x1
= 1
*(sp - 16 - 8) = x2
= 2
sp = sp - 16