我正在处理arm64汇编编程,并希望使用svc指令实现系统调用。我在网上找不到任何可用的arm64系统调用实现,也找不到arm64系统调用列表。请解释一下实现方法。
我正在处理arm64汇编编程,并希望使用svc指令实现系统调用。我在网上找不到任何可用的arm64系统调用实现,也找不到arm64系统调用列表。请解释一下实现方法。
你可以在x0
到x5
中传递六个参数,返回值保存在x0
中。
以下是汇编代码片段,这是来自Android Bionic的libc实现的write
系统调用。 write
的三个参数已经在x0-x2
中。系统调用号码传递在x8
中。
/* Generated by gensyscalls.py. Do not edit. */
#include <private/bionic_asm.h>
.hidden __set_errno
ENTRY(write)
mov x8, __NR_write
svc #0
cmn x0, #(MAX_ERRNO + 1)
cneg x0, x0, hi
b.hi __set_errno
ret
END(write)
看一下AArch64 ABI。
更新的架构都使用来自include/uapi/asm-generic/unistd.h的数字。
您还可以查看arch/arm64/include/asm/syscall.h来处理参数和返回值。
如果您手头有as
和ld
,则可以创建一个仅以退出值退出的简单可执行文件。
这里的42
是我们的返回值,93
是exit
系统调用。
$cat answer.s
.global _start
_start:
mov x0, #42
mov x8, #93
svc #0
$as answer.s -o answer.o
$ld answer.o -o answer
$./answer
$echo $?
42