在要把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)被讀入的位址』,好了,這是規定,所以作者也布希望再有人問為什麼了!