Make an Extra Effort and Then Continue to Develop

在要把helloos.nas转成helloos.asm之间,碰到了Notepad++无法检视课本所附程式的日文注解,全部都是问号空格,让人真是不自在,好在有这个外挂Notepad++ 多国语浏览 plugin v0.1 pre-alpha可以解决问题,但是这个外挂只有附原始程式,听说还要用Visual C++ 2005 Express来编译,现在早就没有这种就软体了,感谢也有人翻译了放在网路上,不过是放在http://www.badongo.com/file/10406839,这样下载有点麻烦说!NppEnc_v0.1我另外放在工作达人这里,有兴趣的人可以参考使用,解压缩后将.dll档放在Notepad++的plugins里,重新启动就可以使用!

解码后的程式码如下:

; hello-os
; TAB=4

ORG  0x7c00   ; このプログラムがどこに读み迂まれるのか

; 以下は标准的なFAT12フォーマットフロッピーディスクのための记述

JMP  entry
DB  0x90
DB  “HELLOIPL”  ; ブートセクタの名前を自由に书いてよい(8バイト)
DW  512    ; 1セクタの大きさ(512にしなければいけない)
DB  1    ; クラスタの大きさ(1セクタにしなければいけない)
DW  1    ; FATがどこから始まるか(普通は1セクタ目からにする)
DB  2    ; FATの个数(2にしなければいけない)
DW  224    ; ルートディレクトリ领域の大きさ(普通は224エントリにする)
DW  2880   ; このドライブの大きさ(2880セクタにしなければいけない)
DB  0xf0   ; メディアのタイプ(0xf0にしなければいけない)
DW  9    ; FAT领域の长さ(9セクタにしなければいけない)
DW  18    ; 1トラックにいくつのセクタがあるか(18にしなければいけない)
DW  2    ; ヘッドの数(2にしなければいけない)
DD  0    ; パーティションを使ってないのでここは必ず0
DD  2880   ; このドライブ大きさをもう一度书く
DB  0,0,0×29  ; よくわからないけどこの值にしておくといいらしい
DD  0xffffffff  ; たぶんボリュームシリアル番号
DB  “HELLO-OS   ” ; ディスクの名前(11バイト)
DB  “FAT12   ”  ; フォーマットの名前(8バイト)
RESB 18    ; とりあえず18バイトあけておく

; プログラム本体

entry:
MOV  AX,0   ; レジスタ初期化
MOV  SS,AX
MOV  SP,0x7c00
MOV  DS,AX
MOV  ES,AX

MOV  SI,msg
putloop:
MOV  AL,[SI]
ADD  SI,1   ; SIに1を足す
CMP  AL,0
JE  fin
MOV  AH,0x0e   ; 一文字表示ファンクション
MOV  BX,15   ; カラーコード
INT  0x10   ; ビデオBIOS呼び出し
JMP  putloop
fin:
HLT      ; 何かあるまでCPUを停止させる
JMP  fin    ; 无限ループ

msg:
DB  0x0a, 0x0a  ; 改行を2つ
DB  “hello, world”
DB  0x0a   ; 改行
DB  0

RESB 0x7dfe-$  ; 0x7dfeまでを0x00で埋める命令

DB  0x55, 0xaa

; 以下はブートセクタ以外の部分の记述

DB  0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB  0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432

这样是不是较清楚了!

今天8/27又借到这本书,再度读到这里,为什么要写oRG 0x7c00,大家可以看作者的这个对照图,是日文的,看起来可能就有点痛苦了,不过课本直接这样写‘0x00007c00-0x00007dff:开机磁区(Boot Sector)被读入的位址’,好了,这是规定,所以作者也布希望再有人问为什么了!