为什么系统调用用于汇编编程?

d4r*_*0rd 1 assembly instruction-set

在我试图理解计算机中最低级别发生的事情时,我最近发现了一些东西,以便我可以在汇编中开始编码:https:///0xax.github.io/asm_1/

    section .data
    msg db      "hello, world!"
section .text
    global _start
_start:
    mov     rax, 1
    mov     rdi, 1
    mov     rsi, msg
    mov     rdx, 13
    syscall
    mov    rax, 60
    mov    rdi, 0
    syscall
Run Code Online (Sandbox Code Playgroud)

但我在这里看到的是,正在制作系统调用,我们正在使用ABI.我不明白的是为什么汇编中存在系统调用.我所知道的是汇编到机器代码更多的转换 - 将操作码改为二进制等价物等.

所以我想知道的是为什么我们要进行系统调用,并且有一种方法可以在不使用系统调用的情况下在x86_64 ISA的纯组装指令中实现它(因此可能编写我们自己的打印功能.)

Mar*_*oom 6

对于初学者来说,相信大会是某种神秘的神秘学科,可以操纵现实本身的结构,这是很常见的.
当门徒足够强大/知识渊博/纯洁/神圣时,它将能够掌握汇编语言难以理解,难以理解的艺术.

但事实并非如此.
装配很简单,非常容易(在我看来,缺少一个类型系统使它不适合日常编程,而不是它的形式).比C更容易 - 需要数百个精心制作的标准页面.

虽然你可以直接在汇编中访问硬件(你可以在每种语言中使用一小组功能来修复架构),这并不意味着1)你实际上可以2)它实际上是有意义的.

第一点是出于安全原因.
所有现代处理器都允许第一个处理器为第二个处理器设置线束,这转换为操作系统为任何应用程序设置安全范围.
如果不是这种情况,任何流氓代码都会使您的操作系统无法使用(如果他们使用随机密码将AT设置为ATAPI锁定状态,那该怎么办?).
因此,您必须要求操作系统代表您执行操作,以确保您不会执行您不应该执行的操作.

第二点是出于实际考虑.
你肯定知道有大量的硬件供应商,他们的设备通常遵循一些行业标准(但他们不能),并且这些标准不能立即编程.
例如,读取通过USB盒连接的外部SATA磁盘上的文件需要知道PCI(e),PCI(e)MSI,IOAPIC/APIC路由,IDT,保护模式,IO映射,XHCI,DMA,SCSI/ATAPI.
每一个都需要一本书本身.
然后你插入一个不同的设备,这是一套学习和掌握的大多不同的标准/技术.
这里有一些深奥的东西,因为资源并非总是公开可用,所以获得全面的知识是很困难的.
这就是操作系统再次代表您行事的原因 - 它会将文件的读取抽象为"打开符号名称"和"从文件描述符中读取".

所有这些都是系统调用的概念.
除了日常使用操作系统之外,它与组装无关.

如果您对操作系统如何执行系统调用感兴趣,那么Linux源代码是一个很好的资源(介绍性书籍可能是强制性的,因为操作系统是复杂的软件).
如果您想知道程序如何与OS交互,查看编译器输出,运行时库,ELF文件格式及其功能,将会有所启发.
如果你想对裸机进行编程,那么制作引导加载程序或DOS程序是一个很好的起点,因为它是已经制作的服务和你可以自由访问硬件的环境之间的混合.
研究芯片组数据表,特别是总线拓扑,技术和连接,将有很大帮助(例如,参见我的这个答案,在其背景下并不完全正确,但给出了总线技术列表).
如果你想制作一个固件,那就像制作一个引导加载程序一样,除了你要首先初始化和配置硬件,你需要具备主板模型的特定知识.

当然,正如哈罗德所启发的那样:syscall是在x86-64 ISA中.