NASM 纯汇编打造简单中文操作系统(1.boot.asm 操作系统的开始--引导程序)
2009-03-06 15:52
435 查看
一、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
[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
相关文章推荐
- NASM 纯汇编打造简单中文操作系统(4 mouse.inc 鼠标驱动部分(设置鼠标中断,建立中断处理程序))
- NASM 纯汇编打造简单中文操作系统(2 init.asm初始化操作系统内存。进入32位保护模式)
- NASM 纯汇编打造简单中文操作系统(2 init.asm初始化操作系统内存。进入32位保护模式)
- NASM 纯汇编打造简单中文操作系统(3 kernel.asm 内核(实现汉字的显示,鼠标的支持等))
- NASM 纯汇编打造简单中文操作系统(6 vesa.inc 显卡绘图)
- NASM 纯汇编打造简单中文操作系统(4)
- NASM 纯汇编打造简单中文操作系统(5)
- NASM 纯汇编打造简单中文操作系统(1)
- NASM 纯汇编打造简单中文操作系统(5 interrupt.inc 初始化中断控制器)
- NASM 纯汇编打造简单中文操作系统(2)
- NASM 纯汇编打造简单中文操作系统(3)
- 写操作系统(五)执着 初始引导程序 加载汇编内核
- 用nasm重写linux0.0磁盘引导程序boot.s
- [Intel汇编-NASM]主引导扇区程序介绍
- Linux操作系统的简单指令及如何使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。
- 操作系统引导程序(nasm)
- 用nasm汇编做引导程序
- Zephyr应用笔记:mcuboot引导程序简单介绍(不分析细节原理)
- 实践一个简单的引导程序
- CFITSIO安装及安装成功简单程序测试(Ubuntu操作系统下)