9

我正在使用 arm64 汇编编码,我想使用 svc 指令实现系统调用。我在网上找不到任何有效的 arm64 系统调用实现。另外,我找不到 arm64 的系统调用列表。还要解释实现。

4

1 回答 1

9

可以传入六个参数,x0返回x5值保存在x0

给出一个汇编代码片段,这是来自Android Bionic 的 libc implementation 的write系统调用。的三个参数已经在. 系统调用号被传入。writex0-x2x8

/* 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是我们的返回值,93exit 系统调用

$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
于 2014-08-21T17:11:43.860 回答