写操作系统(四)执着 初始引导程序 中断

来源:互联网 发布:淘宝短连接在线生成 编辑:程序博客网 时间:2024/04/28 20:48

 这里再研读一下关于运用中断的一个引导程序。

   为了不浪费必要时间查找,这里有一份关于中断详细的文档,可以到CSDN下载中下载。

   BIOS除了自检等还提供了一序列的中断服务,可以为系统和用户调用,像上次代码的屏幕显示。

   调用的格式为int **h, **说明的中断号,当然之前要对一些寄存器进行设置,对实现**号中断进行初始化。

   上一次的代码虽然把系统给引导过来,但只是在屏幕上显示一个串,用户没有接口和系统交互,所以下面来用中断来实现一下简单的交互:键盘的回显。下面的代码开始规范着来写,不用代码工具了,看着挺不方便的。另外,能写的注释我都写出来了,为了让接触和了解跟多的内容,编写对结果不必要的代码,是牺牲代码效率的。

 

 

;; 文件:echo.asm
;; 工具:UltraEdit14.12编辑
;; 创建日期:2009/02/2 HouRj
;; 作用:显示欢迎信息,并可以回显键盘
;; 备注:没有文件系统,1.44M 512bits/80sec 软盘启动,
;; hourj_er@yahoo.cn
;;      ===================================
org 0x7c00
  mov ax,0          ;设置数据段
  mov ds,ax
  mov es,ax
  jmp start          ;跳到开始处执行
  welstr db 'welcome to mumOS',13,10,0 ;欢迎字符串定义
  chbuf db '',0,0      ;临时缓冲区定义,用来装载输入字符
                
print: 
  lodsb            ;从SI地址处加载一个字节到al           
  or al,al          ;检查要显示的串是否结束,因为如果结束,si给加载0x0进入al
  jz pe            ;判断是否相等即zf=0,则结束,跳至pe结束输出
  mov ah,0x0e           ;10号中断初始化,功能0EH  在Teletype模式下显示字符
  mov bx,0x0002        ;显示方式
  int 0x10          ;打开中断
  jmp print          ;中断响应,跳至print输出
 
pe:              ;显示串结束返回
  ret
 
welcome:           ;欢迎仪式功能块,只是显示一个串而已,后面将会加载很多
 mov si,welstr        ;将welstr的偏移地址移送si,目的是为了lodsb做准备
 call print         ;准备工作(si)已经做好,开始调用print打印到屏幕上
  ret
 
echo:             ;回显功能块
  mov ah,0          ;准备接受键盘字符,存入到al中
  int 0x16          ;开启16号键盘中断
 
 ;下面的三行可以由这三行代替,这里只是为了重用print
 ;起始这里小题大作,因为键盘的输出缓冲就是al,而显示的输入缓冲也恰为al
 ;mov ah,0x0e        ;同20-23行
 ;mov bx,0x0002
 ;int 0x10
 
  mov [chbuf],al        ;将al的字符移送到chbuf的空间里
  mov si,chbuf        ;将chbuf的地址移送si,为lodsb做准备
  call print         ;显示
  jmp echo          ;循环
 
start:            ;程序从这里开始
  call welcome        ;首先调用welcome欢迎模块
  call echo          ;然后调用echo回显模块
 
  times 510-($-$$) db 0    ;引导条件代码
  dw 0xaa55

 

;;      ===================================

 

   按照上一篇那样载入虚拟机,便可以看到效果,怎么样还可以吧。这样就可以在一定程度上对中断有新的认识。另外,有一点,我们要想控制CPU,唯一的途径就是控制相应的寄存器,而中断的初始化就是靠寄存器来设置的,所以,对某些中断和寄存器要有一定熟练程度,我也一直在做。