自己编写操作系统的笔记1

于渊写的书《自己动手写操作系统》出的可以说很早了(05年)。我虽然当年就买来,但是自己水平太差,只好一直摆在书架上。这回借育才科技创新项目,重新拿起这本书,花费了很多时间研究,终于看到了第五章。

        不过有句古话不错,学而不思则罔,思而不学则殆。今天返回头来看看他基于nasm构筑的系统大厦,不免有些感觉头晕,就跟看到了开源程序一样。当然不是看不起,只是一切都跟所学习的不同,难免犯晕。故而决定自己用masm程序编写,并且加入自己想用到的一些东西。 

        首先就从boot sector开始。在boot sector上于渊用了20行代码,轻而易举的写出了传说中的boot sector。然而我用masm却没这么轻松了。

先看源代码:

code segment
start:
 mov ax,07c0h     ;init
 mov ds,ax      
 mov es,ax
 call dispstr
 jmp $       ;循环
dispstr:
 mov ax,msg      ;以下几行参见原书注释
 mov bp,ax
 mov cx,15
 mov ax,01301h
 mov bx,000ch
 mov dl,0
 int 10h
 ret
msg:
 db "Hello,OS world!"   ;所要打印字符串
; rept 510-($-seg start)  ;填满至510B
; db 0
; endm
 dw 0aa55h      ;写入操作系统标志0xAA55
 code ends     ;编译结束
 end start

 

编译过程:

ml -c boot.asm

link boot.obj

那么就出现几个问题了:

1。我编译好的exe有1009B,用exe2com转换后com文件才497字节,并不是原来的512B。按说这样的0xAA55h不在正确的位置,但是写入后居然可以启动。

2.org 07c0h不能使用,否则编译后程序有31k之巨,也不能写入磁盘。那么这个org究竟是什么用?怎么会使编译后的程序变大?按说它只在运行时影响内存才对。

3.rept 510-($-seg start)  始终对这句话不放心,这句话能可靠地把AA55放到511和512吗?结果看来是这样的,但是boot.bin只有497B,很不放心。

4.说前三个问题时我没有注释掉这三行

; rept 510-($-seg start)  ;填满至510B
; db 0
; endm

现在注释掉了,编译并且转换后程序才48B,但是正常启动了。这回的AA55h肯定不在应该在的地方了,可是还是正常启动, 跟已知是不符的。

 

 

 

当然也确定一件事,mov ax,07c0h是必须的,否则用mov ax,cs不能打印出msg。肯定是ds指向不对,就是说程序加载的位置确实是07c0h

 

 

 

最新研究:

code segment
start:
 mov ax,07c0h     ;init
 mov ds,ax      
 mov es,ax
 call dispstr
 jmp $       ;循环
dispstr:
 mov ax,msg      ;以下几行参见原书注释
 mov bp,ax
 mov cx,15
 mov ax,01301h
 mov bx,000ch
 mov dl,0
 int 10h
 ret
msg:
 db "Hello,OS world!"   ;所要打印字符串
 code ends     ;编译结束
 end start

现在我连AA55h都不写入了,还是能够启动。非常奇怪了。太奇怪了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值