NASM 纯汇编打造简单中文操作系统(1.boot.asm 操作系统的开始--引导程序)

一、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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

替计划实验室Plan T Labs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值