x86汇编如何操作显卡让显示器打印字符
x86汇编如何操作显卡让显示器打印字符
1 | mov ax, 0b800h |
8086CPU是一个16位的处理器,它有8个16位通用寄存器,每个寄存器都有自己的名字,而计算机经常处理单字节的数据,一个字节是8位,如果每次都用16位寄存器处理有些浪费,所以AX、BX、CX、DX这四个寄存器可以分别拆成2个8位寄存器来使用。
8086一共有20根地址线,所以寻址能力是2^20,也就是1M,8086可以找到0x00000-0xFFFFF之间的所有地址。0x00000-0x9FFFF分配给内存,一共是640KB。0xCFFFF-0xFFFFF分配给BIOS。0xAFFFF-0xBFFFF分配给了包括文字模式、图像模式在内的显示部分
显卡是支持文字模式和图形模式,其中文字模式还支持黑白和彩色两种。
图像模式包括VGA等占用0xA0000-0xAFFFF之间的64K空间,黑白模式占用0xB0000-0xB7FFF之间的32K空间。彩色文字模式占用0xB8000-0xBFFFF之间的32K空间。这些地址空间实际上以映射显卡的显存
假如显存空间有4GB,而映射的地址空间可能只有256MB,那么首先把4GB开始的256MB映射到CPU的寻址空间,如果不够用,就切换到下一个256MB….
文字模式会把显示器的整个区域分割为25行,每行80个字符,也就是整个屏幕可以显示2000个字符
如果为了显示字符,每次都操作像素太痛苦了,所以把每个可以显示的字符的像素先定义好,然后发送给显卡一个字符的代号,显卡就知道该怎么显示了,这个代号就是ASCII码表。
比如我们想显示字符’A’,它的编码是0x41,不能只是单纯的把0x41发送给显卡,还需要指定一个属性字节,这个字节必须紧跟在字符’A’后面发送
如果我们想显示一个黑底白字的字符’A’,就要发送0x4107到显存去,而计算机默认就是显示黑底白字。但是发送的时候得空一个字节:
1 | mov ax, 0b800h |
CPU执行指令就是单纯的顺序执行,所以程序的指令都是放在一起的,占用一端连续的地址空间,称为代码段,数据也是一样的道理,所以也会有一个数据段
CS寄存器指向代码段的起始地址,DS寄存器指向数据段的起始地址,指令寄存器IP里面存储的并不是绝对的物理地址,而是相对于CS寄存器的偏移,也就是说CPU访问指令是通过段地址+偏移地址的方式来进行的,CS指定代码段基准地址,IP指定代码段的偏移地址。
1 | ; 设定数据段寄存器DS, 值为0b800h |











