「BIOS」タグアーカイブ

📝 BIOSと戯れてみる♪(5)

今日のバグ:「読み込んだはずのセクタが全部 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つくらい” でだいたい片付きますね。


■ おまけ:

『記憶ではそうなっていてもコードは正直。ほれ、ほれほれ。』

宿敵『バグ』の嘲笑が聞こえるような一件でした。