【问题标题】:How do you directly interface with hardware from Assembly Language?您如何直接与汇编语言中的硬件交互?
【发布时间】:2013-07-07 11:03:25
【问题描述】:

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

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

【问题讨论】:

  • 你可以从OSDev开始。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    只有在有操作系统的情况下才很难访问硬件,当然,使用操作系统让硬件做一些有用的事情自然要容易得多。

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

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

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

    【讨论】:

    • 如果你想编写自己的小操作系统,汇编是一个糟糕的选择,像其他人一样做,主要是 C,在绝对必要的地方加一点汇编。相同的答案,与语言无关,您想直接访问硬件只需执行此操作,读/写地址即可。 DOS 作为开发操作系统是一个不错的选择,因为它足以让您继续前进,但如果您想绕过它,也很容易摆脱它。很长一段时间以来,Windows 只是一个 DOS 程序,在某些时候会停止进行 dos 调用。 (Linux 也可以/也可以这样启动)
    • 在阅读了 Rienhard 的回答后,我强烈建议,既然您还不知道自己问题的答案(您确实公开询问过),那么您应该寻找 pcemu、开源、80x86 指令集模拟器之类的东西借助 BIOS 和 DOS 功能,您可以在此基础上进行构建,但同时有机会在您通过此教育阶段并逐步提升时进行调试。视频、硬盘、USB 都将成为主要的数月至数年的学习经验,以完成您似乎正在尝试做的事情。尽可能简单地开始,避免重大失败。
    • 启动时,我只需使用名为 HxD 的程序将汇编代码写入软盘的第一个扇区。 bios会自动加载它。现在,您如何确定要与之交互的硬件的地址?说明书上写的吗?是所有 PC 都一样,还是因机器而异?你能给我一个小代码示例或一个链接到如何完成的示例吗?非常感谢!
    • 视情况而定,像串行端口这样的东西可能对过去有些静态的旧有支持,我认为 bios 可以控制它。其他东西在 pcie 上并枚举,甚至在同一台机器上有时会出现在不同的地方,所以你必须询问 pci 控制器所有东西在哪里,这就是为什么我建议让 dos 最初这样做,因为有一些 dos 实用程序只是将这些信息转储出去。
    • @dwelch:抱歉,我只是忘了 +1 你的答案,现在完成了。感谢您的精彩解释。
    猜你喜欢
    • 2014-10-15
    • 2011-02-06
    • 2014-06-05
    • 2015-10-31
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多