assembly - 如何通过汇编语言直接与硬件交互?

标签 assembly operating-system nasm low-level bios

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

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

最佳答案

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

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

只有当操作系统妨碍时,访问硬件才会变得困难,当然,有了操作系统,让硬件做一些有用的事情就容易得多。

幸运的是,BIOS 已经枚举了 pci(e) 硬件,这是 PC 的工作方式,因此您可以使用一些我认为的 DOS 实用程序来查明硬件是如何枚举的。另一种“PC 做事方式”,硬件的 PCI(e) 地址也是 x86 地址,两个地址空间重叠,因此一旦您获得某些外设的 PCI(e) 地址,您就可以在您的计算机中使用该地址。代码。当然,由于 PCIE 窗口对于视频之类的东西来说相对较小,因此您仍然必须翻阅外设内存,但这是外设特定的,而不是 PC 或 x86 的东西。

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

更好的是使用模拟器 pcemu 或其他模拟器,而不是从硬件开始,根据您选择的模拟器,您可能可以更好地了解正在发生的情况,并且像 uart 这样的外设可能会简单得多因为您可能不必初始化它,只需开始向它抛出字节(直到您了解更多信息)。

关于assembly - 如何通过汇编语言直接与硬件交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17555019/

相关文章:

assembly - 影响输出的声明标签的位置

c - 进程组内的流水线

assembly - NASM:在寄存器中存储段和偏移量的远调用

x86 - 陷阱和中断有什么区别?

c - VxWorks中任务阻塞时,栈中保存的任务上下文是什么?

windows - NASM + GoLink : "The following symbol was not defined in the object file or files"

linux - x86 英特尔汇编 Linux sys_write + sys_read

c - GDB 打印值相对于寄存器

C++ ASM Inline如何在ASM中使用struct成员?

c++ - 使用 Visual C++ 构建时如何使用 SSE(以及 SSE2、SSE3 等)扩展?