Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么在汇编编程中使用系统调用?_Assembly_Instruction Set - Fatal编程技术网

Assembly 为什么在汇编编程中使用系统调用?

Assembly 为什么在汇编编程中使用系统调用?,assembly,instruction-set,Assembly,Instruction Set,在我试图了解计算机中最底层发生了什么的过程中,我最近发现了一些东西,以便我可以开始在汇编中编码: 但我在这里看到的是,有系统调用正在进行,我们正在使用ABI。我不明白的是为什么汇编中会有系统调用。我所知道的是,汇编成机器码更多的是一种转换——将操作码转换成二进制等价物等等 因此,我想知道的是,我们为什么要进行系统调用,是否有一种方法可以在x86_64 ISA的纯汇编指令中实现这一点,而无需使用系统调用(因此可能需要编写我们自己的打印函数)初学者通常认为组装是一种神奇的、深奥的学科,它允许操纵现实

在我试图了解计算机中最底层发生了什么的过程中,我最近发现了一些东西,以便我可以开始在汇编中编码:

但我在这里看到的是,有系统调用正在进行,我们正在使用ABI。我不明白的是为什么汇编中会有系统调用。我所知道的是,汇编成机器码更多的是一种转换——将操作码转换成二进制等价物等等


因此,我想知道的是,我们为什么要进行系统调用,是否有一种方法可以在x86_64 ISA的纯汇编指令中实现这一点,而无需使用系统调用(因此可能需要编写我们自己的打印函数)

初学者通常认为组装是一种神奇的、深奥的学科,它允许操纵现实本身的结构。
当门徒足够强大/知识渊博/纯洁/神圣时,他将能够掌握汇编语言这门难学、晦涩难懂的艺术

但事实并非如此。
汇编很容易,非常容易(在我看来,这是因为缺少类型系统,不适合日常编程,而不是它的形式)。 要比C语言简单得多——这需要数百页精心编制的标准

虽然您确实可以直接在汇编中访问硬件(您可以在每种语言中都这样做,只要有一小组具体化体系结构的函数),但这并不意味着1)您实际上可以2)这实际上是有意义的

第一点是出于安全原因。
所有现代处理器都允许第一个处理器为第二个处理器设置线束,这就意味着操作系统为任何应用程序设置了安全周界。
如果不是这种情况,任何恶意代码都会使您的操作系统无法使用(如果他们使用随机密码将您的HD设置为ATAPI锁定状态会怎么样?。
因此,你必须要求操作系统代表你做事,这样它才能确保你没有做你不应该做的事情

第二点是出于实际考虑。
您肯定知道,有很多硬件供应商,他们的设备通常遵循一些行业标准(但他们不能),这些标准不能立即编程。
例如,读取通过USB盒连接的外部SATA磁盘上的文件需要了解、、保护模式、、DMA、。
每一本书本身都需要一本书。
然后插入不同的设备,这是一套需要学习和掌握的基本不同的标准/技术。
这里有一点深奥,获取完整的知识很难,因为资源并不总是公开的。
这就是操作系统再次代表您的原因——它将文件读取抽象为“打开符号名”和“从文件描述符读取”

所有这些都是系统调用的概念。
它与汇编无关,而是与操作系统的日常使用有关

如果您对操作系统如何执行系统调用感兴趣,Linux源代码是一个非常好的资源(因为操作系统是复杂的软件,所以必须要有一本介绍性的书)。
如果您想知道程序如何与操作系统交互,查看编译器输出、运行时库、ELF文件格式及其功能将有助于了解情况。
如果您想对裸机进行编程,那么制作引导加载程序或DOS程序是一个很好的开始,因为这是一个已经精心设计的服务和一个您可以自由访问硬件的环境的混合体。
研究芯片组数据表,特别是总线拓扑、技术和连接,将大有帮助(例如,请参阅上下文中不完全正确的部分,但给出了总线技术列表)。
如果你想制作一个固件,那么这与制作一个引导加载程序是一样的,只是因为你首先要初始化和配置硬件,你需要对主板型号有一个特定的了解

当然,正如:
syscall
位于x86-64 ISA中。

简单概述:

系统调用是在用户模式下运行的应用程序与内核通信的主要方式。操作系统最重要的功能之一是提供对系统硬件的管理。“普通”应用程序通常不能随心所欲地访问硬件资源。它需要通过操作系统。它负责管理访问同一设备的多个应用程序,确保正确访问并提供安全性


这就是为什么应用程序总是需要与操作系统通信。与操作系统通信的机制必须与语言无关。这就是系统调用。

syscall
纯粹是来自x86_64的汇编指令。如果您列出ASM和C之间的优缺点表,您将得到答案。我的下一个问题是:为什么只
syscall
我们可以更深入地在ASM中制作整个内核?@fuz,我不确定你在使用USB时是否可以。甚至不确定你在使用AHCI时是否可以。我必须重新审视这些标准,才能找到真正的答案。但我相信这并不重要:)
    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