在没有int 10h的情况下以实模式显示字符?

时间:2017-09-04 21:37:20

标签: x86 operating-system intel bootloader bios

网上的某些程序似乎在没有使用int指令的情况下执行相同的工作,,例如直接写入bx800 。在这种情况下,BIOS究竟是否知道是否应将某些文本写入控制台?是保证发生初始中断吗?如果是这样的话,究竟是什么时候,以及做同样工作的等效装配线(或中断向量和ah的组合)是什么时候?

2 个答案:

答案 0 :(得分:4)

BIOS服务用于抽象硬件 如果您对基础视频卡有足够的了解,可以直接对其进行编程。

VGA已被广泛记录 [1]  [2] [3] 虽然主题并不容易,但由于普遍缺乏适当的介绍,学习曲线非常陡峭。
可以介绍本网站上的答案主题之外的介绍,但可以提供关于可以绕过BIOS的简短版本。

VGA卡有一个内部存储器,可以循环读取(绘图是循环业务),以生成模拟信号以驱动CRT compatible显示。
如果我们知道如何将正确的数据放入内存中,我们就能绘制一个字符。

并非系统存储器(子系统)回收CPU地址空间中的所有地址,范围0xb8000 - 0xbffff被分配给VGA卡内部存储器 - 写入该范围将数据放入卡中#39;内存。

知道如何将一些数据放入卡的内存中,我们仍然必须知道要放入什么。 幸运的是,VGA支持text modes,允许程序员指定字符代码,而不是逐个像素地绘制每个glyph。 每个代码(用行话,code point - 与所使用的编码的代码单元一致)通过IBM当时(CP437)设置的字符集来与字形相关联。 /> 与代码点一起,程序员可以指定character attributes,例如前景色和背景色。

例如,启用文本模式后,要在第一列的第一行绘制蓝色 A ,只需写入:

mov WORD [es:0], 0941h        ;Assuming ES = 0b800h
                              ;09 = Attributes (Blue on black)
                              ;41h = Code point of the glyph A

每个字符占用两个字节(一个字),第一个是代码点,第二个是属性 由于x86 endianness,41h(代码点)将在地址0处结束,而属性将在地址1处。

在内部,问题更复杂:请参阅memory layout和奇数/偶数模式。

这有效地对硬件进行编程是:将数据移动到不同语义的上下文中。

答案 1 :(得分:0)

我理解的是你在写屏幕时遇到了麻烦。在实模式下,您根本无法真正访问任何中断。您只能写入视频内存。这是我快速输入的一些代码。希望这有效

mov edi, 0xB8000        ; This will point to the location in ram (b8000 = video mem.)
mov BYTE [edi],   'H'   ; First we declar we are moving a byte, then we move 'H' into video memory.
mov BYTE [edi+1],  0Fh  ; The second byte is always color. This is White on black
mov BYTE [edi+2], 'i'   ; Next print the i
mov BYTE [edi+3],  0Fh

我们在这里看到的是我们首先将edi(内存指针)移动到视频内存中的位置。 \