Aarch64汇编语言

从ARMv8-A开始出现了64位的ARM指令集, ARM官方将64位的ARM指令集叫做Aarch64

Aarch64汇编中寄存器

Aarch64微处理器中,程序员可以使用31个64位的通用寄存器x0 ~ x30,堆栈指针寄存器sp,指令指针寄存器pc。也可以只使用这些通用寄存器中的低32位,即w0~w30,wsp。ARM遵循ATPCS规则,Aarch64汇编语言函数前8个参数使用x0-x7寄存器(或w0-w7寄存器)传递,多于8个的参数均通过堆栈传递,并且返回值通过x0寄存器(或w0寄存器)返回
在使用软中断进行系统调时,系统调用号通过x8寄存器传递,用svc指令产生软中断,实现从用户模式到管理模式的切换。例如:

mov x0, 123 // exit code
mov x8, 93  // sys_exit() is at index 93 in kernel functions table
svc #0      // generate kernel call sys_exit(123);

关于系统调用syscall的系统调用号索引可以查看这里

https://elixir.bootlin.com/linux/latest/source/arch/sh/include/uapi/asm/unistd_64.h

Aarch64汇编语言

Aarch64汇编指令集所有指令的长度固定,每条指令是4字节(32位宽度),并且没有Thumb指令集。

访存指令

ARM32中的LDM、STM、PUSH、POP指令,在Aarch64中并不存在。取而代之的是LDP、STP指令,如一般在函数开头用来代替PUSH.
例如,用IDA Pro逆向的某个Aarch64SO库函数的开头和结尾:

STP      X24, X23, [SP,#var_40]!
STP      X22, X21, [SP,#0x40+var_30]
STP      X20, X19, [SP,#0x40+var_20]
STP      X29, X30, [SP,#0x40+var_10]
ADD      X29, SP, #0x40+var_10
....
SUB      SP, X29, #0x30
LDP      X29, X30, [SP,#0x150+var_120]
LDP      X20, X19, [SP,#0x150+var_130]
LDP      X22, X21, [SP,#0x150+var_140]
LDP      X24, X23, [SP+0x150+var_150],#0x40
RET

参考文献

arm64汇编语言
Wiki ARM Architecture
Aarch64 Register and Instruction Quick Start
ARM The Architecture for the Digital World
浅析基于ARM的Linux下的系统调用的实现

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值