操作系统入门(二)痛并学习中

   上一个版本的boot在显示了一串字符后就进入了死循环。
    操作系统的定义是一个架设在硬件层和用户层的管理软件,我必须扩展boot使它逐步接近意义上的操作系统。
    IBM-PC兼容系列的电脑在启动时载入从软盘的0磁道开始的 512个字节,放入 0x7c00的内存,然后从那里开始执行。
    你的操作系统不可能才512个字节吧!为此我们在执行这512个字节的程序里必须加入
  1. 载入另一个位置上的n个字节的程序放到一个规定好的内存里
  2. 在执行到512字节前作一个跳转,来到那个规定好的内存的开头继续执行
    下面是改造后的boot.asm
;; 文件:boot.asm
;; 作用:从7c00h处启动,显示载入系统信息"Loading System..."
;; 没有文件系统,1.44M 512bits/80sec 软盘启动,
;; 创建日期:2004/01/30 flyback
;; 
fly-back@163.com
;;      ===================================
 ORG 7C00H ; 启动入口地址
main:
 jmp start  ; 跳转到开始程序入口

 .loadmsg db 'Loading System...',0 ; 要显示的字符窜以0结尾
 .loadfail db 'Load init Failure!',0 ; 载入失败信息
 %define loadpoint 9000h   ; 载入点,初始化程序载入到9000h的地方
 %define loadoffset 0000h

 
start:
 cli   ; 关中断,防止意外中断打断程序执行
 mov ax, cs ;
 mov ds, ax ; 设置数据段
 mov es, ax ;
 xor ax, ax  ; 设置堆栈段
 mov ss, ax
 mov sp, 0ffffh ; 7c00以前为堆栈入口
 sti   ; 开中断
 mov si, main.loadmsg ; 调用显示载入信息
 call pntchr
 ; jmp $   ; 死循环
 ; 读取在200h(512)字节后400h字节前的数据放入载入点(9000h)处 es:bx
 ; 读取软盘,调用bios 13h中断功能
 ; 复位
 mov ah, 00h
 mov dl, 0h
 int 13h
 mov ax, loadpoint
 mov es, ax
 mov bx, loadoffset
loadfloppy: 
 mov     ah, 0x02 ; BIOS 读取扇区命令
 mov     al,  0x01   ; 读取一个扇区
 mov     ch, 0h  ; 起始磁道 0
 mov     cl,  2h  ; 起始扇区 第二扇区
 mov     dh, 0h  ; 磁头号 1
 mov     dl,  0h  ; 驱动器号 0 a:
 int     13h    ;   
 jc failure   ; 失败显示失败信息 
 jmp  loadpoint:loadoffset
 
failure:
 lea si, [main.loadfail]
 call pntchr
 hlt
;----------------显示字符串----------------------
pntchr: 
 lodsb    ; 从DS:SI装载一个字符到AL
 or al,al    ;
 jz endpntchr   ; 如果 al = 0, 返回 
      ;
 mov ah,0x0E   ;
 mov bx,0x0007  ; 
 int 0x10    ; 调用bios中断显示字符
 jmp pntchr   ;
      ;
endpntchr:    ;
 ret     ; 返回
;--------------------------------------------------
times 512-($-$$) db 0   ; 保证boot区有512个字节
; dw 0AA55h    ; boot区标记
镜像文件boot.img现在有512个字节,我们还需要在它的后面无缝连接一段用来被boot程序载入的200h~400h程序(大小200h)
;; 文件:other.asm
;; 作用:一个显示字符的后继程序
;; 创建日期:2004/01/30 flyback
;; fly-back@163.com
;;      ===================================
start2:
 ; 清除屏幕
 mov ax, cs
 mov ds, ax
 mov es, ax
 mov si, start2msg
 call pntchr2
 jmp $
;----------------显示字符串----------------------
pntchr2: 
 lodsb    ; 从DS:SI装载一个字符到AL
 or al,al    ;
 jz endpntchr2   ; 如果 al = 0, 返回 
      ;
 mov ah,0x0E   ;
 mov bx,0x0007  ; 
 int 0x10    ; 调用bios中断显示字符
 jmp pntchr2   ;
      ;
endpntchr2:    ;
 ret     ; 返回
start2msg db 13,10, 'init system...',0
;times 1474560 - ($ - $$) db 0  ; 1.44M 编译成镜像文件可以在viturlpc /vmware中使用
用命令行方式:
    nasm boot.asm -o boot.img
    nasm other.asm -o other.img
    partcopy other.img 0 200 boot.img 200
把boot.img和other.img合并成一个文件
然后利用vmware作测试
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值