X86 以实模式显示字符而不显示int 10h?

X86 以实模式显示字符而不显示int 10h?,x86,operating-system,intel,bootloader,bios,X86,Operating System,Intel,Bootloader,Bios,网络上的一些程序似乎没有使用int指令就完成了同样的工作,比如直接写入bx800。在这种情况下,BIOS如何确切地知道是否应该将某些文本写入控制台?是否保证会发生初始中断?如果是这样的话,确切的时间,以及做相同工作的等效装配线(或中断向量和ah的组合)是什么?据我所知,您在向屏幕写入时遇到了问题。在实模式下,您根本无法访问任何中断。您只能写入视频内存。这是我很快为您输入的一些代码。希望这能奏效 mov edi, 0xB8000 ; This will point to the lo

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

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

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

我的理解是你在屏幕上写东西有困难。在实模式下,您根本无法访问任何中断。您只能写入视频内存。这是我很快为您输入的一些代码。希望这能奏效

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

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

VGA已被广泛记录[] []尽管由于缺乏适当的介绍,主题并不容易,学习曲线也相当陡峭。
在本网站上,一个不适合回答问题的介绍,但可以提供一个关于为什么可以绕过BIOS的简短版本

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

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

知道如何将一些数据放入卡的内存中,我们仍然必须知道要将什么放入卡中。
幸运的是,VGA支持允许程序员指定字符代码,而不是逐像素绘制每个像素。
每个代码(行话,-与所用编码的代码单元一致)都通过IBM当时()设置的字符集与字形关联。
除了代码点之外,程序员还可以指定诸如前景色和背景色等颜色

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

mov WORD [es:0], 0941h        ;Assuming ES = 0b800h
                              ;09 = Attributes (Blue on black)
                              ;41h = Code point of the glyph A
每个字符占用两个字节(一个字),第一个字节是代码点,第二个字节是属性。
由于x86,41h(代码点)将在地址0处结束,而属性将在地址1处结束

在内部,问题更为复杂:请参见和奇偶模式


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

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

VGA已被广泛记录[] []尽管由于缺乏适当的介绍,主题并不容易,学习曲线也相当陡峭。
在本网站上,一个不适合回答问题的介绍,但可以提供一个关于为什么可以绕过BIOS的简短版本

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

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

知道如何将一些数据放入卡的内存中,我们仍然必须知道要将什么放入卡中。
幸运的是,VGA支持允许程序员指定字符代码,而不是逐像素绘制每个像素。
每个代码(行话,-与所用编码的代码单元一致)都通过IBM当时()设置的字符集与字形关联。
除了代码点之外,程序员还可以指定诸如前景色和背景色等颜色

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

mov WORD [es:0], 0941h        ;Assuming ES = 0b800h
                              ;09 = Attributes (Blue on black)
                              ;41h = Code point of the glyph A
每个字符占用两个字节(一个字),第一个字节是代码点,第二个字节是属性。
由于x86,41h(代码点)将在地址0处结束,而属性将在地址1处结束

在内部,问题更为复杂:请参见和奇偶模式


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

“在实模式下,您根本无法访问任何中断。”这是完全错误的。我不知道你在这里想说什么…我不知道你为什么每次移动一个字节而不是一个单词。如果你使用一个循环,你可能会考虑字符串指令(即STOS)。注意你的代码会出错。代码>edi超出64KiB限制。你要么需要正确地使用分段,要么设置一个不真实的模式。“在真实模式下,你根本无法访问任何中断。”这是完全错误的。我不知道你在这里想说什么…我不知道你为什么每次移动一个字节而不是一个单词。如果你使用一个循环,你可能会考虑字符串指令(即STOS)。注意你的代码会出错。有限公司