Assembly 如何从汇编语言直接与硬件接口?

Assembly 如何从汇编语言直接与硬件接口?,assembly,operating-system,nasm,low-level,bios,Assembly,Operating System,Nasm,Low Level,Bios,所以,我决定今年夏天学习80x86的汇编语言。我拿起四本关于组装的书。到目前为止,我已经读了前两篇,第三篇已经读了一半,我想我理解了所有的内容。我已经写了一些Hello World程序以及书中的其他小练习,我对这门语言感到非常舒服。 然而,有一件事至今没有一本书提到过,那就是我最感兴趣的事情。也就是说,如何直接从汇编语言处理硬件?到目前为止,作者在书中使用了系统调用、跳转到内存中的特定函数和中断,但这些方法依赖于系统中已有的软件 我正在使用NASM编写我的程序,并将它们加载到一台旧的奔腾I计算机

所以,我决定今年夏天学习80x86的汇编语言。我拿起四本关于组装的书。到目前为止,我已经读了前两篇,第三篇已经读了一半,我想我理解了所有的内容。我已经写了一些Hello World程序以及书中的其他小练习,我对这门语言感到非常舒服。 然而,有一件事至今没有一本书提到过,那就是我最感兴趣的事情。也就是说,如何直接从汇编语言处理硬件?到目前为止,作者在书中使用了系统调用、跳转到内存中的特定函数和中断,但这些方法依赖于系统中已有的软件


我正在使用NASM编写我的程序,并将它们加载到一台旧的奔腾I计算机中。我现在不使用任何操作系统,只使用BIOS。我想我要做的是编写我的小操作系统,它是自主的,不依赖BIOS(初始引导除外)。有人能帮我吗?

如何仅使用BIOS引导和运行代码

假设您真的只使用BIOS,或者即使您使用的是DOS,也没关系。您只需寻址硬件,在指令中指定某个硬件寄存器的地址,或将该地址放入寄存器,然后进行寄存器间接读写

只有当操作系统遇到阻碍时,才很难访问硬件,自然,使用操作系统使硬件做一些有用的事情要容易得多

幸运的是,BIOS列举了pci(e)硬件,这是PC的工作方式,因此您可以使用一些DOS实用程序来了解硬件是如何列举的。另一种“PC方式”硬件的PCI(e)地址也是x86地址,两个地址空间重叠,因此,一旦获得某个外围设备的PCI(e)地址,就可以在代码中使用该地址。当然,由于pcie窗口对于视频之类的东西来说相对较小,因此您仍然需要在外围内存中翻页,但这是特定于外围设备的,而不是PC或x86

如果您的主板有串行端口/uart,那将是直接访问硬件的最佳起点


更好的方法是使用模拟器pcemu或其他,而不是从硬件开始,这取决于您选择的模拟器,您可能对正在发生的事情有更好的了解,并且像uart这样的外设可能更简单,因为您可能不必初始化它,只需开始向它抛出字节(直到您了解更多).

德韦尔奇完全正确,但我想从更基本的层面回答你的问题:
在大多数情况下,您可以通过控制和状态寄存器访问硬件。在最简单的情况下,例如,您希望从串行行读取数据,并且您正在等待新字符到达。状态寄存器可以设置一位“就绪”,然后从另一个寄存器读取字符。
这意味着您必须像内存地址一样寻址寄存器。同样,在大多数情况下,这是通过将寄存器映射到地址空间来实现的,即寄存器的内存地址位于没有内存的地址范围内,例如最顶层的地址。然后您可以使用大多数访问内存的指令,例如加载和存储。

在现实世界中,情况更为复杂,因为CPU使用虚拟地址,虚拟地址由可编程内存管理单元映射到物理地址空间(寄存器所在的位置)。

您可以从开始。如果您想编写自己的小操作系统,汇编是一个错误的选择,像其他人一样,在绝对必要的地方用C语言编写一个小程序集。同样的答案,在语言上并不重要,你想直接访问硬件,只要做它,读/写地址即可。作为开发操作系统,DOS是一个不错的选择,因为它是一个足以让您继续使用的操作系统,但如果您想绕过它,它也很容易避开。很长一段时间以来,Windows只是一个DOS程序,在某个时候停止进行DOS调用。(linux也可以这样启动)在阅读了Rinehard的答案后,我强烈建议,既然你还不知道自己问题的答案(你确实公开问过),那么你应该寻找类似pcemu的东西,开源的80x86指令集模拟器,具有BIOS和DOS功能,一些你可以建立在上面的东西,但同时在你通过这个教育阶段并逐步提高的过程中,你有机会进行调试。视频、硬盘、usb都将是几个月到几年的重要学习经验,可以帮助你完成你想做的事情。启动时尽可能简单,不会出现重大故障。要启动,我只需使用名为HxD的程序将汇编好的代码写入软盘的第一个扇区。bios会自动加载它。现在,您如何确定要与之接口的硬件的地址?它写在手册上了吗?所有电脑都是一样的,还是机器不同?你能给我一个小的代码示例或者一个链接到一个如何实现的示例吗?非常感谢你!取决于具体情况,像串行端口这样的东西可能对以前的静态支持,我认为bios控制着这一点。其他东西在pcie和枚举上,甚至在同一台机器上,有时也会出现在不同的位置,因此您必须询问pci控制器所有东西都在哪里,这就是为什么我最初建议让dos这样做的原因,因为有些dos实用程序只是将这些信息转储出去。@dwelch:对不起,我只是忘记了+1您的答案,现在完成。谢谢你的解释。