一、从开机到BIOS
何为实模式,简单讲就是逻辑地址等于物理地址的模式。
Intel 8086时期只有20条地址线,也就是说若按字节寻址的话咱们的发挥空间就只有1MB,用16进制表示就是从0x00000到0xFFFFF,以下给出实模式下的地址分布:
BIOS其实也是指令流,也是个程序,所以肯定也得有入口地址,这个入口地址便是0xFFFF0。一开机,入口地址被初始化为0xFFFF0,这是因为开机后寄存器初始化情况如下图所示,只有CS被置为FFFF,其他都是0,
也就是说,一开机就执行下图所示指令:
8086采用小端方式,段地址:0xF000,偏移地址:0xE05B
从0xFFFF0开始的5个字节共同构成jump指令。
执行完上述jmp指令后,寄存器变化情况如下图:
接下来BIOS所做的事情就是各种检测内存显卡等外设信息,然后在0x000到0x3ff处建立中断向量表。
在BIOS做的最后一件事就是将硬盘的主引导扇区读到0x7C00处,然后用一个跳转指令跳到那里执行。如下图黄色部分所示:
二、主引导扇区MBR
MBR大小为512B,上一小节说到BIOS做的最后一件事是将主引导扇区读到0x7C00处,在此之前,BIOS需要检查一下该主引导扇区是否有效。有效的主引导扇区其最后两个字节必须是0x55和0xAA。
三、在屏幕上显示文本
工程师们将显卡的工作模式分成两种。一种是文本模式,一种是图像模式。而且他们的显存也是分开的。有文本模式下的显存和图像模式下的显存。在文本模式下,显存的内容是字符的代码。在图像模式下显存的内容是像素的颜色。
我们可以将字符的编码放到显存里。比如在这里,我们依次存放了字符h,字符e和字符l的编码。在显卡上有字符发生器。这个东西可以根据字符的编码来控制屏幕上的像素。是它们共同组成字符的轮廓。如下图所示:
由于历史的原因,所有在个人计算机上使用的显卡。在加电自检之后,都会把自己初始化到80×25的文本模式。在这一种模式下。屏幕上可以显示25行,每行80个字符,所以叫做80×25的文本模式。那么,这样的话,每屏总共可以显示2000个字符。所以一直以来。从从地址0xB8000一直到0XBFFF的这一部分空间,是留给显卡的。
3.1 准备访问文本模式下的显存
对段寄存器的修改可以通过上述两种方式,而不能直接将数写进段寄存器,如 mov ds, 0xB800 ,这种写法是错误的。
ASCII字符集的编码:
字符的属性
显存如下图所示:
start:
mov ax, 0xb800 ;段地址b800
mov ds, ax
mov byte [0x00],0x4c;ASCII方式
mov byte [0x01],0x04
mov byte [0x02],'o' ;单引号加字符方式
mov byte [0x03],0x04
mov byte [0x04],'v'
mov byte [0x05],0x04
mov byte [0x06],'e'
mov byte [0x07],0x04
mov byte [0x08],' '
mov byte [0x09],0x04
mov byte [0x0a],'y'
mov byte [0x0b],0x04
mov byte [0x0c],"o"
mov byte [0x0d],0x04
mov byte [0x0e],'u'
mov byte [0x0f],0x04
jmp 0x0000:0x7c00
current:
times 510-(current-start) db 0
db 0x55,0xaa
3.2 在Bochs上调试
b 0x7c00 命令相当于在7c00处下断点
c 继续执行
s 下一步
n 相当于显卡的下一步
最后写出 love you如上图所示