跳至主要內容
汇编语言一发入魂 0x01 - Hello World

目标:在屏幕上打印出Hello World

要在屏幕上打印字符就需要对显存进行操作。那么如何操作显存呢?对于汇编语言来说,这个问题的答案是很简单的。如上一篇文章所讲,在计算机启动时,显卡被初始化为文本模式,对应的显存也已经映射到了0xb80000xbffff这段物理地址空间。所以直接向这段内存写入数据,屏幕上就能够打印出对应的字符了。那么如何向内存写入数据呢?

向内存写入数据,首先需要知道内存对应的地址。对于8086处理器来说,内存地址是以段基址:段内偏移的形式给出的。物理内存被划分为逻辑上的段,每个段最长为64KB。这是有历史原因的,8086具有20位的地址线,寻址范围是1MB,但是8086的内部寄存器都是16位的,最多只能访问64KB的内存空间,无法完全利用这巨大的内存,真是太可惜了。天无绝人之路,Intel的那帮巨佬们就想出了一个巧(鸡)妙(贼)的办法。16位的寄存器左移4位不就是20位了吗?理想很丰满,但是这里有一个问题。因为采用了左移4位的方法,所以无论地址是多少,最终计算得到的地址都是16字节对齐的。举个栗子,0x1234这个地址,左移4位之后就变成了0x12340,同理,0x1235对应0x123500x123400x12350之间的16个字节是没法访问到的。这个就很好解决了,把0x1234看作一个段,这样的话再加一个偏移量就可以访问到刚才无法访问到的空间了。栗如要访问0x1234f这个位置,那么给个0xf的偏移量就可以了。说干就干,于是他们马上设计了一个计算物理地址的电路,做的运算就是从段寄存器里取出来段地址,左移4位,然后在加上一个16位的偏移地址,形成20位的物理地址。这个电路俗称地址加法器。


未央大约 13 分钟汇编语言显卡显存