一、boot.asm 操作系统的开始--引导程序
[BITS 16]
[ORG 0x7c00]
jmp main ;跳过数据定义部分执行代码,否则会执行定义的数据
;--------------------------------------------------------------------------------------------------------
;引导数据区
;------------------------------------------------------------
BOOT_INFO: DB ' Booting System Please Waite ..............',0x0D,0x0A,0
;BOOT_INFO1: DB ' Read Kernel OK............................',0x0D,0x0A,0
;BOOT_INFO2: DB ' Load Kernel OK.Press Any Key to Continue!',0x0D,0x0A,0
BOOT_DRIVER DB 0
;LOADER_SEGMENT DW 0x200 ;内核存放的内存段地址
INIT_SEGMENT DW 0x910 ;初始化模块存放地址
;---------------------------------------------------------------------
ShowMessage:
;显示开始引导的提示信息
POP BP
POP SI ;获得字符串所在地址
lp:
MOV AH,0x0E ;设置显示模式
MOV BH,0x00 ;设置页码
MOV BL,0x07 ;设置字体属性
;LOADSB
MOV AL,[DS:SI]
CMP AL,0
JZ .out
int 0x10
INC SI
JMP lp
.out
XOR SI,SI
PUSH BP ;恢复IP返回地址
ret
;-----------------------------------------------------------------------------------------------
main:
;定义堆栈段
MOV AX,0x9000
MOV SS,AX
MOV ESP,0xFFFF
;调用函数ShowMessage显示文字
MOV AX,BOOT_INFO
PUSH AX
CALL ShowMessage
;读取磁盘扇区内容加载内核模块到指定的内存区
;初始化软区
MOV AX,0
MOV DX,0
INT 0x13
;读取初始化模块
.rinit:
MOV AX,[INIT_SEGMENT] ;将要把INIT方过去所在的段基址
MOV ES,AX
MOV BX,0 ;读数据到内存0x910:0x0 到 0x910:0x400 es:bx处
MOV AH,2
MOV DH,0
MOV DL,[BOOT_DRIVER] ;驱动器为0表示a:区
MOV CH,0 ;零磁道
MOV CL,2 ;从第2个扇区开始读
MOV AL,2 ;读入扇区数,每个扇区为 512B.init大小为1024b所以读2
INT 0x13 ;调用13中断读取磁盘信息01
JC .rinit
;MOV DX,0x3F2 ; 关闭软区马达
;MOV AL,0
;OUT DX,AL
JMP DWORD 0x910:0
TIMES 510-($-$$) DB 0 ;从当前位置减去开头的位置的大小以为其他的容于大小填充成0.
;保持文件512字节大小
DB 0x55
DB 0xAA ;0X55AA是标准格式,TIMES 用510计算。因为0X55AA还有两个字节正好512字节
整个文件采用nasm编译器编译。
编译方法为:
nasm -f bin xxx.asm -o xxx.img