qemu使っていてOS自作入門の3日目やっててセクタなめるところで0x20エラーが出るとき-fdaオプションを使う #osdevjp
セクタ読み込む最初のコードで躓いた、なんか、うまく動いてない。 エラーコードがAHに入ってるみたいなのでAHに雑に0x30足して読めるASCII出るようにして表示してみる
ORG 0x7c00 ; FAT12っぽい JMP entry DB 0x90 DB "KONITIWA" ; おなまえ、適当にかえてみた DW 512 ; せくた DB 1 ; くらすたは1 DW 1 ; FATがどこからはじまるか (1セクタ目 DB 2 ; FAT個数は2 DW 224 ; ルートディレクトリ領域、224エントリ DW 2880 ; このドライブの大きさ、2880セクタ DB 0xf0 ; メディアのタイプ、これは仕様あとで読むか DW 9 ; FAT領域の長さは9セクタ DW 18 ; 1トラック18セクタ DW 2 ; ヘッドは2つ DD 0 ; パーティションがないとき0(?) DD 2880 ; このドライブの大きさをもう一度かく、大事なことなので二度言う感 DB 0, 0, 0x29 ; え、よくわからないけどこの値にしておくといいと書かれていてよく分からない!! DD 0xffffffff ; たぶんボリュームシリアル番号、ボリュームシリアル番号とは、たぶん、とは... DB "HANACHINOS!" ; ディスクの名前、11バイト DB "FAT12 " ; フォーマットの名前8バイト ; RESB 18 ; RESBすると間が空くのか、ここ18かくと18バイトあく ; ↑うまくいかなかったのでここ参考に書き換え ; https://qiita.com/duloxetine/items/ce1fc1d861f0c3d33651 TIMES 18 DB 0 ; ほんたい entry: MOV AX, 0 MOV SS, AX MOV SP, 0x7c00 MOV DS, AX read_sectors: MOV AX, 0x0820 MOV ES, AX MOV CH, 0 MOV DH, 0 MOV CL, 2 MOV AH, 0x02 MOV AL, 1 MOV BX, 0 MOV DL, 0x00 INT 0x13 JC show_error MOV AL, 0x6F MOV AH, 0x0e MOV BX, 12 INT 0x10 fin: HLT JMP fin error: MOV SI, err_msg show_error: ADD AH, 0x30 MOV AL, AH MOV AH, 0x0e MOV BX, 12 INT 0x10 JMP fin msg: ; あなたのCPUに話しかけています DB 0x0a, 0x0a ; 0x0a, 10は改行、覚えた DB "I love ruby <3 <3" ; <3、記号だけど出るのかな DB 0x0a ; かいぎょ DB 0 ; NULLしゅうたん? ; ほんたいおわり err_msg: DB 0x0a, 0x0a DB "error" DB 0x0a ; かいぎょ DB 0 ; RESB 0x1fe-$ ;0x001feまで0うめ、なるほど-$ ; ↑うまくいかなかったのでここ参考に書き換え ; https://qiita.com/duloxetine/items/ce1fc1d861f0c3d33651 TIMES 0x1fe-($-$$) DB 0 DB 0x55, 0xaa ; CPUへの伝言おわり ; ブートセクタ以外を埋めてる、のかな? DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432
そうすると1文字Pが出てきた。 Pとは
% ruby -e 'p (?P.ord-0x30).to_s 16' "20"
wikiで確認すると0x20は
0x20:コントローラ異常 oswiki.osask.jp
すごい雑に飛ばし読みしてたからかもしれないけど、これだとダメで
% nasm helloos2.nas && qemu-system-i386 helloos2
-fda
オプションでフロッピーディスクとして渡すといいみたい
% nasm helloos2.nas && qemu-system-i386 -fda helloos2
それでは