最近在学习Linux0.12内核,正在读《Linux内核完全剖析》。一开始就被ax86写的引导扇区弄晕了。于是Google了很多资料。最终实验了一晚上终于搞定。下面来看看我们怎么用Windows下的MASM来写个Boot Sector。因为我MASM汇编用的比较熟,所以就用MASM来写,当然,汇编只有语法差异,你用什么来写都没关系。
首先,先来说说计算机怎么启动的。经过一系列BIOS加电、系统自检后,会将硬盘0面0道1扇区的512字节(Boot Sector)加载到内存地址07c0:0000处,之后就是执行这个Boot Sector部分了。而我们要写的就是这部分。这部分之后会引导操作系统启动,我们暂时不管这些。
需要注意的是,系统会检查内存地址07c0:01FE处是否等于0xaa55,不等于则报错。
既然知道了系统会把前512扇区加载内存,那么我们就要在汇编里做些设置。
源码如下:
data segment
org 07c00h ;将程序加载到07c0:0000处
start:
mov ax,data
mov es,ax ;后面的字符串寻址输出需要es:bp
mov bp,offset msg1
lop:mov ah,13h ;第10h中断向量的功能代码13h---写字符串
mov al,0 ;写模式 使用0就可以
mov bh,0 ;0页,默认为0页即可
mov bl,07 ;显示属性,黑底白字
mov cx,32 ;字符32个,更科学的方法是两个标号相减,为了简化代码,直接数出来
mov dh,10 ;输出在第10行
mov dl,24 ;输出在第24列
int 10h ;10h 使用第10h中断向量,显示器输出
jmp lop ;死循环,让字符保持在屏幕上
ret
msg1 db "Welcome to my Operating System !"
org 07c00h+512-2 ;地址计数器跳到512字节的倒数第二字节,即07c0:01FE
DW 0AA55H ;此处在512字节的最后两字节写入AA55H !!
data ends
end start