3

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

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

4

2 回答 2

6

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

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

仅当操作系统阻碍时,访问硬件才会变得困难,当然,使用操作系统使硬件做一些有用的事情自然要容易得多。

幸运的是,BIOS 已经枚举了 pci(e) 硬件,这是 PC 的处理方式,所以你可以使用一些我认为的 DOS 实用程序来了解硬件是如何被枚举的。另一种“PC 做事方式”硬件的 PCI(e) 地址也是 x86 地址,两个地址空间重叠,因此一旦您获得某些外围设备的 PCI(e) 地址,您就可以在您的代码。自然,由于 pcie 窗口对于视频之类的内容相对较小,因此您仍然必须通过外围存储器进行分页,但这是特定于外围设备的,而不是 PC 或 x86 的东西。

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

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

于 2013-07-09T18:11:07.363 回答
4

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

于 2013-07-09T18:13:55.577 回答