您的位置:首页 > 其它

[自己动手写操作系统]的学习实践【第一章】

2008-05-03 17:45 323 查看
最近开始看这本书了,所以就写下自己看的随笔。希望大家共同探讨,对错误进行指正。再次特别感谢一下书的作者于渊大哥,算实我看过的很好的作品了。希望有兴趣的朋友好好研读,呵呵。

第一章 马上动手写一个最小的“操作系统”
本章讲述了一个简单非依赖操作系统的程序boot.asm,该代码如下:
代码1-1 /chapter1/a/boot.asm
-------------------------------------------------------------
org 07c00h ; 告诉编译器程序加载到7c00 处
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 调用显示字符串例程
jmp $ ; 无限循环,实际为跳转到当前行$,反编译结果 9 EBFE jmp short 0x9
DispStr:
mov ax, BootMessage ; BootMessage 实际的地址随着你原先规定的地址会不一样的,我们这里是 07c1E
mov bp, ax ; es:bp = 串地址
mov cx, 16 ; cx = 串长度
mov ax, 01301h ; ah = 13h, al = 01h, ah=13用于显示字符串;ES:BP=串地址;CX=串长度,DH,DL=起始行列,BH=页号,AL=1 BL=属性
mov bx, 000ch ; 页号为0(bh = 0) 黑底红字(bl = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 号中断,用于显示
ret
BootMessage: db "Hello, OS world!"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为
; 512 字节。$$为本节开始的地址
dw 0xaa55 ; 结束标志
-------------------------------------------------------------
上面只是实现了把一段字符显示在目标设备上,把这段代码用NASM(Linux上带有这个工具,我们在windows上已经安装了,手册见帮助文件) 编译一下:
nasm boot.asm –o boot.bin
我们由此得到一个引导程序(512B)。我们的目标是把它写入磁盘的0磁道0扇区成为一个引导盘。我们下面介绍IMG镜像文件的读写方法。由于这种映象文件的数据可以看成是一种线性序列(数组)。数组的第一个单元也就是0磁道0扇区0单元,接下来是0磁道0扇区1单元……
所以我们实际编程就是产生一个文件,这个文件的大小是一张磁盘(1.44MB),文件的前512字节就是 boot.bin的内容。我们编制的文件是a.fla,然后装入linux就可以看到我们的程序运行的结果。
调试方法,可以将文件编译成为一个com文件,该文件可以直接在系统上运行。
nasm boot.asm –o boot.com
文件开始部分改写为
%ifdef _BOOT_DEBUG_
org 0100h;
%else
org 07c00h ; 告诉编译器程序加载到7c00 处
%endif
对于编译成的com文件,我们可以看到其内存的映象与代码是一样的。两者的区别就在地址不一样,其它都一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: