写操作系统(四)执着 初始引导程序 中断
2009-02-16 13:06
295 查看
这里再研读一下关于运用中断的一个引导程序。
为了不浪费必要时间查找,这里有一份关于中断详细的文档,可以到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,唯一的途径就是控制相应的寄存器,而中断的初始化就是靠寄存器来设置的,所以,对某些中断和寄存器要有一定熟练程度,我也一直在做。
为了不浪费必要时间查找,这里有一份关于中断详细的文档,可以到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,唯一的途径就是控制相应的寄存器,而中断的初始化就是靠寄存器来设置的,所以,对某些中断和寄存器要有一定熟练程度,我也一直在做。
相关文章推荐
- 写操作系统(三)执着 初始引导程序
- 写操作系统(五)执着 初始引导程序 加载汇编内核
- 用Bochs搭建操作系统引导程序调试环境
- 如何开发自己的操作系统的引导程序?
- 操作系统实验一之引导程序
- 自己动手实现操作系统引导程序(OS bootloader)——借助QEMU/GDB/losetup/dd等工具
- NASM 纯汇编打造简单中文操作系统(1.boot.asm 操作系统的开始--引导程序)
- 如何开发自己的操作系统的引导程序
- 自己动手写操作系统 第六章 :丰富中断处理程序
- 专注于操作系统4之引导程序
- 专注于操作系统5之引导程序代码
- 比LILO更强劲的多操作系统引导程序
- NASM 纯汇编打造简单中文操作系统(4 mouse.inc 鼠标驱动部分(设置鼠标中断,建立中断处理程序))
- 开发自己的操作系统引导程序
- 操作系统学习_Linux0.12_引导启动程序_为啥要不停移动
- 恢复Linux操作系统的GRUB引导程序
- 中断19引导加载程序过程详解
- Office 2007或Office 2010套件初始安装中断后无法重新启动安装程序,错误“Microsoft Office xxx在安装过程中出错”
- 我的Sinix操作系统(2)引导程序(1)
- 引导程序和操作系统的区别