1,第一个启动扇区
2,使用BIOS写消息
3,看看机器码
4,不用BIOS向屏幕打印输出
5,中断
6,进入保护模式
7,非实模式
8,32 位打印输出
附录A,更多资讯
1,第一个启动扇区
代码
下面的代码可能是从软盘启动的最小代码的例子。
2 hang:
3 jmp hang
4 times 512-($-$$) db0
在实模式下,CPU启动,然后BIOS从地址0000:7C00处开始加载代码。在NASM汇编器中,“ times 512 ...”是指
用0填充满512字节。有时候会用另一种表述,在十六进制中 200 等于 十进制中的 512。
经常地,你会在最后看到一个叫启动标识符的东西: 0xAA55。旧版本的 BIOS 通过检查这个标记去差别磁盘上是否
是一个启动扇区。现在,这个是不必要的,若是必要的,最后的代码行会用这个标识符替换 。如下面的版本:
2 hang:
3 jmp hang
4
5 times 510-($-$$) db 0 ; 留下最后2字节
6 db 0x55
但是,我需要指出的是,当你用这些代码启动,你会看光空白的屏幕同闪烁的光标。你或许会注意到了另外两件事:一个是软驱马达已经关闭,另一个是,你可以按 Ctrl-Alt-Del来重新启动。这儿的重点是,中断(如 0x09 号中断)仍然像平常一般生效。
下面,试试关中断看看发生了什么事情:
2 cli ; 关中断
3 hang:
4 jmp hang
5
6 times 510-($-$$) db 0
7 db 0x55
8 db 0xAA
你会看到,软驱马达没有关闭,并且不能通过 Ctrl-Alt-Del来进行重启。
如何你移除循环代码,用0填满启动扇区,BIOS对此会给出一些提示。在我的机器上是“Operating System Not Found”。
我换没有尝试用0填满除启动标示符外的启动扇区会是什么情况。
创建磁盘镜像
上面代码是NASM汇编代码。用partcopy, dd 或者debug得到到软盘。然后你能从这个软件启动
windows
2 partcopy boot.bin 0 200 -f0
3 OR
4 debug boot.bin
5 -W 100 0 0 1
6 -Q
Unix
2dd if=boot.bin of=/dev/fd0
(第一篇END)