你如何直接与汇编语言的硬件接口?

时间:2013-07-09 17:55:51

标签: assembly operating-system nasm low-level bios

所以,我决定今年夏天学习80x86的汇编语言。我收集了四本关于装配的书。到目前为止,我已经阅读了前两个,虽然我已经读了第三个,但我认为我理解了所有已呈现的内容。我已经写了一些Hello World程序以及书中的其他一些小练习,我觉得这种语言非常舒服。 然而,到目前为止,还有一件事没有涉及到这本书,而且这是我最感兴趣的事情。也就是说,你如何直接从汇编语言处理硬件?到目前为止,作者已使用系统调用,跳转到内存中的特定函数和中断,但这些方法依赖于系统中已存在的软件。

我正在使用NASM编写我的程序并将它们加载到旧的Pentium I计算机中。我现在不使用任何操作系统,只是BIOS。我想我正在尝试做的是编写我的小型操作系统,它是自主的,不依赖于BIOS(初始启动除外)。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:6)

如何仅使用BIOS启动和运行代码?

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

当操作系统阻碍时,访问硬件很困难,当然,使用操作系统,硬件做一些有用的事情会更容易。

幸运的是,BIOS已经枚举了pci(e)硬件,即PC的处理方式,因此您可以使用一些DOS实用程序来查找硬件的枚举方式。另一种“PC服务方式”硬件的PCI(e)地址也是x86地址,两个地址空间重叠,所以一旦获得某些外设的PCI(e)地址,那么你可以在你的地址中使用该地址码。很自然,因为对于像视频这样的东西,pcie窗口相对较小,你仍然必须通过外围存储器进行分页,但这是外围特定的,而不是PC或x86的东西。

如果您的主板有一个串口/ uart,那么它将是直接访问硬件的最佳起点。

更好的方法是使用模拟器pcemu或其他,而不是在硬件上启动,这取决于您选择的模拟器,您可以更好地了解正在发生的事情,像uart这样的外围设备甚至可能更简单因为你可能不需要初始化它只是开始向它抛出字节(直到你了解更多)。

答案 1 :(得分:4)

dwelch是完全正确的,但我想在更基本的层面回答你的问题:
在大多数情况下,您可以通过控制和状态寄存器访问硬件。在最简单的情况下,例如你想从串行线读取,而你正在等待新角色到达。状态寄存器可以设置一个“就绪”位,然后从另一个寄存器中读取该字符 这意味着您必须处理内存地址等寄存器。同样在大多数情况下,这是通过将寄存器映射到地址空间来完成的,即寄存器具有在没有存储器的地址范围内的存储器地址,例如,最顶层的地址。然后,您可以使用访问内存的大多数指令,例如装载和存储。
在现实世界中情况更复杂,因为CPU使用通过可编程存储器管理单元映射到物理地址空间(寄存器所在的位置)的虚拟地址。