Syscall在ASM中的引用 [英] reference of syscall in asm

查看:0
本文介绍了Syscall在ASM中的引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

https://www.cs.fsu.edu/~langley/CNT5605/2017-Summer/assembly-example/assembly.html

我看到类似下面的例子。但我找不到Syscall的手册。例如,60表示退出,1表示写入。是否有针对所有系统调用的完整手册(包括调用编号和参数含义)?

    global  _start
    section .text

_start:

    ; ssize_t write(int fd, const void *buf, size_t count)
    mov rdi,1           ; fd
    mov rsi,hello_world     ; buffer
    mov rdx,hello_world_size    ; count
    mov rax,1           ; write(2)
    syscall

    ; exit(result)
    mov rdi,0           ; result
    mov rax,60          ; exit(2)
    syscall

hello_world:    db "Hello World!",10
hello_world_size EQU $ - hello_world

推荐答案

系统调用在内核级别(特定于操作系统)为每个CPU体系结构定义。您提供的代码是x86_64汇编,因此这就是您的目标CPU架构。根据您的示例,您使用的是Linux内核。可在此处找到Linux上x86_64的本机系统调用的详细列表:https://filippo.io/linux-syscall-table/

您实际上可以在您的系统上编辑该表以创建您自己的系统调用,但在这样做时要非常小心!内核级编程可能非常危险。Linux上的系统调用表存在于ARCH/x86/syscalls目录中,该目录位于存储内核源代码的目录中。

cat /kernel-src/arch/x86/syscalls/syscall_64.tbl

正如@PeterCordes提到的,您还可以在asm/unistd.h中找到您的计算机上的系统呼叫号,在我的计算机中,它在/usr/include/x86_64-linux-gnu/asm/unistd_64.h中找到。如果您感兴趣,您应该能够在同一目录中找到x86调用。

这篇关于Syscall在ASM中的引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆