硬件基础
- 显卡和显存
计算机屏幕上要显示字符,需要的硬件支撑包括显卡和显存。显卡:和计算机的CPU有点类似叫GPU(Graphics Processing Unit),负责对图像的信息处理。显存:处理存储过程中的完成的信息和未完成的信息等等。顺便一提,显卡分为集成显卡和独立显卡,前者集成在主板上,使用主存。后者独立,使用显存性能强于集显。 - 显示的原理
显卡控制显示器的最小单位是像素,用1个bit来对应一个像素,因为只有黑白两种颜色,分别对应像素的亮和不亮,所以可以用0,1两种状态来表示。显卡只要根据二进制数据来控制这些像素点就可以显示黑白的图像。
要显示彩色,用一个bit,01两种状态就不能满足需求了。现在最主流的做法是利用24bit(3B)来控制一个像素,这样的话就可以表示2^24种状态,我觉得这也是如今显示器色彩越来越丰富的原因。如果一个分辨率为12801024的24位真彩色图像,那么它的大小就是128010243=3.75M。
之前介绍过8086下,1M内存分成了640KB(主存)+64KB(ROM)+320KB(其他设备),其中显存就占据着0xb8000-0xbffff这之间的地址空间。之前是1bit对应一个像素,听起来需要程序员去控制每个像素的显示状态,但是通过硬件上的电路简化了这个过程。
在8025的文本模式下,第一个字符对应屏幕的左上角。通过两个字节来控制一个字符的内容,后一个字节来控制属性。所以是通过8bit来控制一个字符的属性,具体使用如下:第四位控制背景色,高四位控制前景色。颜色RGB三位控制,背景色第一位K表示闪烁,高四位表示第一位I表示高亮。
字符的显示
要显示字符只需要将字符写入显存对应的位置即可,底层电路设计可以描绘出字符的轮廓。
;将es寄存器指向文本模式缓冲区的基地址
mov ax,0xb800
mov es,ax
;控制要显示的字符
;段超越前缀es
mov byte [es:0x00],'H'
;0000 0111 黑底白字
mov byte [es:0x01],0x07
mov byte [es:0x02],'e'
;1010 0100 绿底红字闪烁
mov byte [es:0x03],0xa4
mov byte [es:0x04],'l'
;0000 0111 黑底白字
mov byte [es:0x05],0x07
mov byte [es:0x06],'l'
;0000 0111 黑底白字
mov byte [es:0x03],0xa4
mov byte [es:0x08],'o'
;0000 0111 黑底白字
mov byte [es:0x09],0x07
label: jmp label
times 510-($-$$) db 0
db 0x55,0xaa
数字的显示
上篇说到计算机中是通过向缓存中写入1字节的字符和1字节的属性,这篇主要分析如何显示数字,主要思路是这样1234D(十进制表示)通过除以10取余可以得到它的各位1,2,3,4,在转换成字符’1’,‘2’,‘3’,'4’来显示。
除法的计算
8086中有两种除法:
- 16bit/8bit,被除数需要提前放在AX中,除数放在内存中或者放在寄存器中,最后结果的商放在AL中,余数放在AH中。
- 32bit/16bit,8086 16位的寄存器存储32位数,只能高16放在DX中,低16位放在AX中,最后结果商在AX中余数在DX中。
- 溢出问题:可以想像以上两种除法都存在溢出问题,比如0xfff/0x01,最后结果肯定不能把商放在AL中,余数放在AH中。我的理解是这是计算机底层电路的实现,如果高级语言要实现除法,就得根据现有的规则去设计函数实现自己的除法。