arm/aarch64 汇编速通指南
目录
简单看一下aarch64,arm需要再补
仅作为我个人的学习笔记,里面一堆TBC,且估计会漏洞百出
如有发现问题,请告知我,感激不尽
arm/aarch64 汇编速通指南
arm
TBC
aarch64
栈与函数调用
FULL-DECENDING: SP指向最后一个压入的值,栈从高地址向低地址生长。
SP必须16字节对齐,所以pop和push理所当然的被扬了。See-here
但似乎SP在函数调用中不会变化?TBC
下面是大体函数调用前后,与栈相关的汇编指令。
|
|
寄存器
-
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_64
和aarch64
对比:
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 | 操作码,也就是助记符,说明指令需要执行的操作类型。如mov 、ldr 、ldp 等 |
Cond | 指令执行条件码。如b.hi 等 |
S | 条件码设置项,决定本次指令执行是否影响PSTATE寄存器响应状态位值。 |
Rd/Xt | 目标寄存器,A32指令可以选择R0-R14,T32指令大部分只能选择RO-R7,A64指令可以选择X0-X30。 |
Rn/Xn | 第一个操作数的寄存器,和Rd一样,不同指令有不同要求。 |
Opcode2 | 第二个操作数,可以是立即数,寄存器Rm和寄存器移位方式(Rm,#shit)。 |
常用指令
就记录一下ldr
、str
和ldp
、stp
。
-
LDR/STR REG1,ADDR
从指定地址取值放入寄存器中/把寄存器中值写入指定地址
-
LDP/SDP REG1,REG2,ADD
从指定地址顺序取两个值放入寄存器中/将两个寄存器按顺序写入指定地址。