arm/aarch64 汇编速通指南

简单看一下aarch64,arm需要再补

仅作为我个人的学习笔记,里面一堆TBC,且估计会漏洞百出

如有发现问题,请告知我,感激不尽

arm/aarch64 汇编速通指南

arm

TBC

aarch64

栈与函数调用

FULL-DECENDING: SP指向最后一个压入的值,栈从高地址向低地址生长。

SP必须16字节对齐,所以pop和push理所当然的被扬了。See-here

但似乎SP在函数调用中不会变化?TBC

下面是大体函数调用前后,与栈相关的汇编指令。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
b func
; 调用前保存下一条指令到x30
-- mov x30,pc;
-- add x30,x30,4;
-> 
; 开栈
-> sub sp,sp,#IMM
; 保存bp和ip到栈上
-> push x30;push x29;mov x29,sp
...
; 从栈上恢复bp和ip
-> pop x29;pop x30;
; 销毁栈
-> add sp,sp,#IMM
; 返回
-> ret
-- b x30

寄存器

  • X/W0~X/W30: 整数寄存器

    要么w?操作低32位,同时高32位清零;要么x?操作64位。

    其中,X29相当于rbp。X30为函数调用前保存的、函数返回后应该执行的下一条指令的地址,即ret等价于b x30

  • B/H/S/D/Q/V0~B/H/S/D/Q/V31: 浮点寄存器

  • SP: 相当于rsp

  • NZCV: 相当于x86的EFLAGS

  • XZR: 零寄存器,忽略写操作,读操作返回0

系统调用传参

系统调用传参,x86_64aarch64对比:

arch syscall NR return arg0 arg1 arg2 arg3 arg4 arg5
aarch64 x8 x0 x0 x1 x2 x3 x4 x5
x86_64 rax rax rdi rsi rdx r10 r8 r9

寻址

格式 行为
[reg] 取(reg)地址中的内容
[reg, #IMM] 取(reg+#IMM)地址中的内容
[reg, #IMM]! 取(reg+#IMM)地址中的内容,取完地址之后会将reg的值更新为(reg+#IMM)
[reg], #IMM 取(reg)的地址,取完地址之后会将reg的值更新为(reg+#IMM)

指令格式

可能存在的问题

下文是从某一篇文章抄过来的,Cond和S的解释不太懂(

S目前还没见过

TBC

所有指令定长为4bytes。格式:

<Opcode>{<Cond>}<S> <Rd>, <Rn> {,<Opcode2>}

123 123
Opcode 操作码,也就是助记符,说明指令需要执行的操作类型。如movldrldp
Cond 指令执行条件码。如b.hi
S 条件码设置项,决定本次指令执行是否影响PSTATE寄存器响应状态位值。
Rd/Xt 目标寄存器,A32指令可以选择R0-R14,T32指令大部分只能选择RO-R7,A64指令可以选择X0-X30。
Rn/Xn 第一个操作数的寄存器,和Rd一样,不同指令有不同要求。
Opcode2 第二个操作数,可以是立即数,寄存器Rm和寄存器移位方式(Rm,#shit)。

常用指令

就记录一下ldrstrldpstp

  • LDR/STR REG1,ADDR

    从指定地址取值放入寄存器中/把寄存器中值写入指定地址

  • LDP/SDP REG1,REG2,ADD

    从指定地址顺序取两个值放入寄存器中/将两个寄存器按顺序写入指定地址。

0%