今日のバグ:「読み込んだはずのセクタが全部 0x00 だった件」
今日は BIOS の int 0x13 を使ってディスクを読んでいたんですけど、
なぜか返ってくるバッファが全部 00 00 00 00 ...。
いやいや、そんなわけないでしょう。
ダンプで見るとデータ入ってます。。
仕様の制限か?BIOS がサボってるのか?と思って、いろいろ調べてみました。
結論から言うと──
サボっていたのは BIOS じゃなくて『 わたし』でした。
■ まず疑ったのは「LBAの指定ミス」
セクタ 1 を読んでるつもりだったんです。
「いや、もしかして 0 で読んでる?」
と思ってコードを見返します。
mov word [DAP_LBA], 1
はい、ちゃんと 1 になってる。
LBA 1(つまりパーティション先頭)のはず。
なのに全ゼロ。
うーん。LBAが悪いわけじゃない。
■ 次に疑ったのは「ES:BX の指定ミス」
読み込み先のメモリだ。
これをミスると BIOS が ちゃんと読み込んでるのに
全然違う場所を見て「ゼロだ!」と思い込む典型的なパターン。
実際わたしは何度もやってる。
mov ax, 0x0000
mov es, ax
mov bx, 0x8000
問題なし。
……いや、ほんとに?
■ そして真犯人が登場
ES:BX でもなく
LBA でもなく
DAP の構造でもなく。
犯人は “デバイス番号 DL”。
mov dl, 0x00
はい、FDD でした〜。
ひたすら HDD(0x80)だと思いこんで
ずっと 0x00(フロッピー)に読め読め言ってたら、
そりゃ BIOS も「そんなデバイスないし…」ってなる。
返ってくる AH はちゃんとエラーコード出してたのに、
わたしが見てなかっただけ。
■ 「見えてるようで見てない」ってやつ
メモリダンプのログも
読み込みコードも
全部「それっぽく」見えるのよね。
でも
“デバイス番号が 80 かどうかを見ない”
という基本を忘れてた。
ほんと初歩。
こういうときって、
「バグって難しい」とかじゃなくて
**“自分の思い込みの方が強い”**というのが原因だったりする。
■ 今日の学び
バグは複雑なところには潜んでない。
単純な場所に潜んでいる。
- LBAが0か1か
- ES:BXが本当にそこを指しているか
- DLが0x80か
- AHのエラーコードをちゃんと見るか
OS 自作や BIOS で遊んでると、
もっと難しい問題が出るように思えるけど、
実際は “基本の3つくらい” でだいたい片付きますね。
■ おまけ:
『記憶ではそうなっていてもコードは正直。ほれ、ほれほれ。』
宿敵『バグ』の嘲笑が聞こえるような一件でした。