网上的一些程序似乎做同样的工作,甚至没有使用int
指令,,如直接写入bx800
。在这种情况下,BIOS究竟应该如何知道某些文本是否应该写入控制台?是否确保初始中断发生?如果是这样,何时,什么是做同样工作的等效流水线(或中断向量和ah
的组合)?在没有int 10h的实模式下显示字符?
回答
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和奇数/偶数模式。
这就是将硬件有效编程为:将数据移入不同语义的上下文中。
我的理解是你在写入屏幕时遇到了麻烦。在实模式下,您根本无法访问任何中断。您只能写入视频内存。以下是我为您快速输入的一些代码。我们希望,这个工程
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的限制。您需要正确使用分段或设置虚幻模式。 –
- 1. Bootstrap模式没有显示
- 2. 没有显示在我的模式
- 3. 43行或更多是否有标准的BIOS Int 10h视频模式?
- 4. INT 10H 13H BIOS字符串输出不工作
- 5. QGraphicsPixmapItem在部署模式下没有在QGraphicsScene中显示
- 6. Fullcalendar没有显示在模式
- 7. Bootstrap模式没有显示在点击
- 8. 订单模式没有显示在Gmail
- 9. 在Emacs GUD(gdb)模式下显示ASCII控制字符
- 10. react-select在反应模式下没有正确显示资产
- 11. 在组织模式下显示带格式化字符的格式化文本
- 12. 我的模式没有显示
- 13. 有没有什么方法来转换字符串模式,如下图所示?
- 14. Softkeyboard-横向模式下的文本不显示EditText的所有字符
- 15. 显示具有多种格式字的显示字符串
- 16. 无模式JDialog没有显示内容
- 17. Html CSS引导模式没有显示
- 18. 替代模板没有显示在模板下拉
- 19. JQGrid没有显示重音字符
- 20. 非ASCII字符没有显示出来
- 21. 显示匹配字符串模式的所有服务名称
- 22. PopupWindow.showAtLocation(View parent,int gravity,int x,int y)没有在GridView的指定位置显示
- 23. 正则表达式模式没有显示我有以下代码匹配
- 24. 嵌入式Google字体中的字符没有显示在Firefox 4和IE9中
- 25. 如何使用INT打印出一个数字10h
- 26. 匹配模式前面没有字符
- 27. 没有显示MVC显示模板
- 28. 在没有缓存模式下的cloudfront
- 29. Apple TV上的字幕未显示在自动模式下
- 30. 显示格式字符串,int到百分比
很棒的回答。没有中断的帮助,VGA本身会重复检查自己的内存范围,并再次绘制整个事物。但是,我必须问你,什么命令'0xb8000 - 0xbffff'作为VGA卡的内部存储器?是传统的,还是事实标准,还是正式记录的? – b1sub
@ Il-seobBae这是遗产。范围实际上从0xa0000开始,即640KiB--原始IBM PC可用的最大内存量。 –
谢谢你的信息。你真的知道你在做什么!祝你今天愉快。 – b1sub