当BIOS启动时,会将启动设备的第一个扇区(通常是512B大小)加载到内存的0x7c00处,并开始执行,因此,顺着这个思路,我们使用nasm编写一个简单的汇编程序,并将其写入到启动设备的第一个扇区中,这样,在电脑启动时就会去加载并执行我们的程序。
另外,需要知道的是对于8086机器,内存的0xB800处开始到BFFFF的地址 被映射到显卡的显存中,因而,如果想要通过显卡来在屏幕上面显示字符串的话,必须要将字符串写入到该块内存中。以一个字符为例,若想将其输出到屏幕上,首先,将它复制到0xB800处, 然后在后面的一个字节(即0xB801处)放置该字符的显示格式(0x07代表普通的黑底白字)。如果有多个字节将要输出,则依次类推,每个字符后面都紧跟着其显示格式。。。。
还有一点要注意的是,BIOS在加载启动扇区时,会检查其代码格式,只有最后两个字节(即511 和 512字节)为0xaa, 0x55时,才是符合要求的引导程序。所以在程序的最后要对这两个字节进行设定
;boot program
BOOTSEG equ 0x07c0
DISPLAYSEG equ 0xb800
_start:
;初始化数据段,使其指向段基址0X7C0处,即Boot代码被加载的地方
mov ax, BOOTSEG
mov ds, ax
;将文本显示内存段基址 放在ES中,供后面显示字符使用
mov ax, DISPLAYSEG
mov es, ax
mov cx, msglen
mov si, message
xor di, di
print_str:
mov al, [si]
mov [es:di], al
inc si
inc di
mov byte [es:di], 0x07
inc di
loop print_str
jmp near $ ;死循环,程序在此处终止
message db "Loading System...", 13, 10
msglen db $ - message
times 510-($-$$) db 0
dw 0xaa55
具体的可以使用bochs仿真器来运行看看效果