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

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *