您的位置:首页 > 其它

NASM 纯汇编打造简单中文操作系统(1)

2010-01-29 12:06 363 查看
一、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

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kylixfire/archive/2009/03/06/3963541.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐