【发布时间】:2018-02-13 02:53:24
【问题描述】:
网上有些程序似乎不用int指令也能做同样的工作,比如直接写bx800。在这种情况下,BIOS 究竟如何知道是否应该将某些文本写入控制台?是保证会发生初始中断吗?如果是这样,确切的时间,以及执行相同工作的等效装配线(或中断向量和ah 的组合)是什么?
【问题讨论】:
标签: x86 operating-system intel bootloader bios
网上有些程序似乎不用int指令也能做同样的工作,比如直接写bx800。在这种情况下,BIOS 究竟如何知道是否应该将某些文本写入控制台?是保证会发生初始中断吗?如果是这样,确切的时间,以及执行相同工作的等效装配线(或中断向量和ah 的组合)是什么?
【问题讨论】:
标签: x86 operating-system intel bootloader bios
据我了解,您在向屏幕写入时遇到问题。在实模式下,您根本无法真正访问任何中断。您只能写入视频内存。这是我快速为您键入的一些代码。希望这有效
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(内存指针)移动到显存中的位置。 \
【讨论】:
edi 超出了 64KiB 的限制。您要么需要正确使用分段,要么设置虚幻模式。
BIOS 服务用于抽象硬件。
如果您对底层视频卡有足够的了解,则可以直接对其进行编程。
VGA 已被广泛记录 [1]
[2] [3],虽然这个话题并不容易,而且由于缺乏适当的介绍,学习曲线相当陡峭。
在本网站上没有回答主题的介绍,但可以提供关于为什么可以绕过 BIOS 的简短版本。
VGA 卡有一个内部存储器,可循环读取(绘图是一项循环业务)以生成模拟信号来驱动CRT compatible 显示器。
如果我们知道如何将正确的数据放入该内存中,我们将能够绘制一个角色。
并非CPU地址空间中的所有地址都被系统内存(子系统)回收,0xb8000 - 0xbffff范围被分配给VGA卡内部存储器-写入该范围会将数据放入卡的内部存储器.
知道如何将一些数据放入卡的内存中,我们仍然必须知道要放入什么。
幸运的是,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 和奇/偶模式。
这就是有效地对硬件进行编程:将数据移动到不同语义的上下文中。
【讨论】:
0xb8000 - 0xbffff 是VGA 卡内存?它是传统的,还是事实上的标准,还是正式记录的?