NASM:输入/输出而不是int

时间:2015-06-04 16:41:11

标签: assembly nasm

编写引导加载程序时,如何调用端口而不是使用中断(即int 10h)?在网上有一个列表我不知道已知的载体吗?有没有地方我可以去做bios中断未覆盖的硬件映射(即PCI-GPU)?

2 个答案:

答案 0 :(得分:4)

您可以通过in&进行I / O端口通信。 out说明。

in dest, src:其中dest是输入;我很确定只有累加器寄存器可以用作destsrc是端口号。 src可以是数据寄存器或立即值。

out dest, src:其中dest是端口号;这次数据寄存器或立即值用于destsrc是输出。 src可以是累加器寄存器。

鉴于缺乏信息,我假设您的引导加载程序是针对x86的,并且您将被限制为或多或少地限制为512字节的空间。如果是这种情况,我建议您使用BIOS为您提供的中断,直到您加载内核为止。

可在WikibooksWikipediaOSDev Wiki找到更多信息。

答案 1 :(得分:4)

嗯,问题在于它不仅仅是硬件的映射,而且它不仅仅是计算机中的引导加载程序。

你真正在谈论的是写一个驱动程序。 BIOS管理最简单的设备,并使用最好的方法来实现程序员想要的。对于程序员来说,有一个访问它的API,对于x86实模式来说意味着中断,因为它们是完成上下文切换的最简单方法。

如果您仍想保持实模式,可能还有几个中断,您可能不知道,可以在某种程度上完成Ralf Brown´s Interrupt List

然而,PCI和GPU在 lot 数据的高频下工作,这需要更多的内存和性能,这在实模式下无法轻松操作。保护和长模式是要走的路。

I8086提到了inout指令作为访问设备的方法。 虽然这曾经是真实的,并且对于某些设备保持正确,但还有许多其他方式与硬件通信,例如,内存映射,DMA或与协处理器的通信。有时您只需使用inout来查找设备的内存所在,以便使用内存映射接口访问它。我相信PCI就是其中之一。这些界面不再难以使用,但它们更有效。

你几乎会立刻碰到名为“缺乏官方和免费文档”的墙。你不能对此感到失望,总有很多设备可以免费获得他们的数据表和程序员参考(让我们承认英特尔有大量的文档),尽管它并不总是你自己的GPU或网卡。

TL; DR:您应该尽快切换到保护模式以解锁一系列新选项,然后您可以考虑编写一些驱动程序。 OSDev Wiki肯定会成为一个很好的资源。