【问题标题】:Display characters in real mode without int 10h?在没有int 10h的情况下以实模式显示字符?
【发布时间】:2018-02-13 02:53:24
【问题描述】:

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

【问题讨论】:

    标签: x86 operating-system intel bootloader bios


    【解决方案1】:

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

    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(内存指针)移动到显存中的位置。 \

    【讨论】:

    • “在实模式下,你根本无法真正访问任何中断。” 这是完全错误的。我不知道你在这里说什么......
    • 我不知道你为什么要一次移动一个字节而不是一个字。如果您使用循环,您可能会考虑使用字符串指令(即 STOS)。
    • 请注意,您的代码会出错。 edi 超出了 64KiB 的限制。您要么需要正确使用分段,要么设置虚幻模式。
    【解决方案2】:

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

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

    【讨论】:

    • 很好的答案。在没有中断的帮助下,VGA 本身反复检查自己的内存范围,并重新绘制整个东西。但是,我要问你,什么要求0xb8000 - 0xbffff 是VGA 卡内存?它是传统的,还是事实上的标准,还是正式记录的?
    • @Il-seobBae 这是遗产。范围实际上从 0xa0000 开始,即 640KiB - 原始 IBM PC 可用的最大 RAM 量。
    • 感谢您提供的信息。你真的知道你在做什么!祝你有美好的一天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2012-01-22
    • 2021-11-06
    • 2019-03-14
    • 1970-01-01
    相关资源
    最近更新 更多