b1s*_*sub 0 x86 operating-system intel bios bootloader
网络上的一些程序似乎在不使用int指令的情况下也能完成相同的工作,例如直接写入bx800. 在这种情况下,BIOS 究竟如何知道是否应该将某些文本写入控制台?是否保证初始中断发生?如果是这样,ah那么完成相同工作的等效装配线(或中断向量 和 的组合)是什么时候?
BIOS 服务用于抽象硬件。
如果您对底层视频卡有足够的了解,则可以直接对其进行编程。
VGA 已被广泛记录[ 1 ] [ 2 ] [ 3 ],尽管该主题并不容易,而且由于普遍缺乏适当的介绍,学习曲线非常陡峭。
可以在此站点上提供与答案无关的介绍,但可以提供有关为什么可以绕过 BIOS 的简短版本。
VGA 卡有一个内部存储器,它被循环读取(绘图是一个循环业务)以生成模拟信号来驱动CRT 兼容显示器。
如果我们知道如何将正确的数据放入该内存中,我们将能够绘制一个字符。
并非CPU地址空间中的所有地址都被系统内存(子系统)回收,该范围0xb8000 - 0xbffff被分配给VGA卡内存 - 写入该范围会将数据放入卡的内存中。
知道如何将一些数据放入卡的内存中,我们仍然必须知道将什么放入它。
幸运的是,VGA 支持文本模式,允许程序员指定字符代码而不是逐个像素地绘制每个字形。
每个代码(在行话中,代码点- 与所使用的编码的代码单元重合)通过 IBM 当时设置的字符集(CP437)与一个字形相关联。
除了代码点,程序员还可以指定字符属性,例如前景色和背景色。
例如,一旦启用文本模式,要在第一列的第一行绘制蓝色A只需编写:
mov WORD [es:0], 0941h ;Assuming ES = 0b800h
;09 = Attributes (Blue on black)
;41h = Code point of the glyph A
Run Code Online (Sandbox Code Playgroud)
每个字符占用两个字节(一个字),第一个是代码点,第二个是属性。
由于 x86字节序,41h(代码点)将在地址 0 处结束,而属性将在地址 1 处结束。
内部问题更复杂:请参阅内存布局和奇数/偶数模式。
这就是对硬件进行有效编程的意义所在:将数据移动到不同语义的上下文中。
| 归档时间: |
|
| 查看次数: |
584 次 |
| 最近记录: |