Syscall在ASM中的引用 [英] reference of syscall in asm
本文介绍了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屋!
查看全文