2017-09-04 103 views
0

网上的一些程序似乎做同样的工作,甚至没有使用int指令,,如直接写入bx800。在这种情况下,BIOS究竟应该如何知道某些文本是否应该写入控制台?是否确保初始中断发生?如果是这样,何时,什么是做同样工作的等效流水线(或中断向量和ah的组合)?在没有int 10h的实模式下显示字符?

回答

3

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

的VGA已被广泛记载[1] [2] [3],虽然题目是不容易的,学习曲线非常陡峭,由于普遍缺乏适当的引进。
可以提供一个关于本网站上的答案没有主题的介绍,但可以介绍为什么可以绕过BIOS的简短版本。

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

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

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

例如,一旦被启用文本模式,画一个蓝色在第一列的第一行上的一个只写:

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和奇数/偶数模式。

这就是将硬件有效编程为:将数据移入不同语义的上下文中。

+0

很棒的回答。没有中断的帮助,VGA本身会重复检查自己的内存范围,并再次绘制整个事物。但是,我必须问你,什么命令'0xb8000 - 0xbffff'作为VGA卡的内部存储器?是传统的,还是事实标准,还是正式记录的? – b1sub

+0

@ Il-seobBae这是遗产。范围实际上从0xa0000开始,即640KiB--原始IBM PC可用的最大内存量。 –

+0

谢谢你的信息。你真的知道你在做什么!祝你今天愉快。 – b1sub

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(内存指针)视频存储器中的位置。 \

+4

*“当处于实模式时,根本无法访问任何中断。”*这是完全错误的。我不确定你的意思在这里说... –

+0

我不知道你为什么会一次移动一个字节,而不是一个字。如果你使用循环,你可以考虑字符串指令(即STOS)。 –

+1

请注意,您的代码会出错。 'edi'超出了64KiB的限制。您需要正确使用分段或设置虚幻模式。 –

相关问题