目标:在屏幕上打印出Hello World
。
要在屏幕上打印字符就需要对显存进行操作。那么如何操作显存呢?对于汇编语言来说,这个问题的答案是很简单的。如上一篇文章所讲,在计算机启动时,显卡被初始化为文本模式,对应的显存也已经映射到了0xb8000
到0xbffff
这段物理地址空间。所以直接向这段内存写入数据,屏幕上就能够打印出对应的字符了。那么如何向内存写入数据呢?
向内存写入数据,首先需要知道内存对应的地址。对于8086
处理器来说,内存地址是以段基址
:段内偏移
的形式给出的。物理内存被划分为逻辑上的段,每个段最长为64KB
。这是有历史原因的,8086
具有20
位的地址线,寻址范围是1MB
,但是8086
的内部寄存器都是16
位的,最多只能访问64KB
的内存空间,无法完全利用这巨大的内存,真是太可惜了。天无绝人之路,Intel
的那帮巨佬们就想出了一个巧(鸡)妙(贼)的办法。16
位的寄存器左移4
位不就是20
位了吗?理想很丰满,但是这里有一个问题。因为采用了左移4
位的方法,所以无论地址是多少,最终计算得到的地址都是16
字节对齐的。举个栗子,0x1234
这个地址,左移4
位之后就变成了0x12340
,同理,0x1235
对应0x12350
,0x12340
到0x12350
之间的16
个字节是没法访问到的。这个就很好解决了,把0x1234
看作一个段,这样的话再加一个偏移量就可以访问到刚才无法访问到的空间了。栗如要访问0x1234f
这个位置,那么给个0xf
的偏移量就可以了。说干就干,于是他们马上设计了一个计算物理地址的电路,做的运算就是从段寄存器里取出来段地址,左移4
位,然后在加上一个16
位的偏移地址,形成20
位的物理地址。这个电路俗称地址加法器。
大约 13 分钟