30日でできるOS自作入門【7日目】【祝 1週間目】
概要
これはMozyの1人アドベントカレンダー 2018 の7日目の記事です。
書こうとした経緯は、こちら
今日の内容
- INT 0x13の意味を調べていく
- ハードウェアとソフトウェアの境界を実際に手に取るように理解できた
今日やったこと
昨日やり残していた、調査をするぞ
以下のページを参考に、0x13の意味を調べる
http://oswiki.osask.jp/?(AT)BIOS
らしいぞ。 他には 意味がわかっていなかったディスク関連のアドレスがわかった。 以下引用。
ディスクからの読み込み、ディスクへの書き込み、セクタのベリファイ、およびシーク AH = 0x02; (読み込み時) AH = 0x03; (書き込み時) AH = 0x04; (ベリファイ時) AH = 0x0c; (シーク時) AL = 処理するセクタ数; (連続したセクタを処理できる) CH = シリンダ番号 & 0xff; CL = セクタ番号(bit0-5) | (シリンダ番号 & 0x300) >> 2; DH = ヘッド番号; DL = ドライブ番号; ES:BX = バッファアドレス; (ベリファイ時、シーク時にはこれは参照しない) 戻り値: FLAGS.CF == 0 : エラーなし、AH == 0 FLAGS.CF == 1 : エラーあり、AHにエラーコード(リセットファンクションと同じ) 補足:
これで見ると、戻り値の欄にFLAGS.CF
というのがあるが、これは、キャリーフラグのことらしい。
この関数を呼び出すと、エラーがない場合は、0 ある場合は、1となる。
これによって昨日解説したJC命令(jump if carry: キャリーフラグが1ならジャンプしなさいという命令) の意味が生まれてくる。
キャリーフラグは1bitしか保持できないレジスタでCPUは他にもこういったレジスタをいくつも持っている。
そのほかの項目をみていくと、ハードウェアとのつなぎ目なのだなと感じる。HDDのシリンダとかセクタとかドライブとかを指定するとな。(書いてから気がついたが、この書籍が出た時はフロッピーのセクタとかだったか笑)
ハマりポイント
基本的にここら辺は読んで行けばいい感じなのでさほど詰まっていない。
知ったこと
キャリーフラグのことは知っていたが、実際にどうやって活用するかなどを考えてコードを読み解いて使ったのは初めてだった。
1週間を迎えて
なんとも進行が遅いがどうにか1週間迎えることができた。
1週間毎日記事を書くのっていうのも結構楽しいし、最初の2日とかと違って書かなきゃではなく、今日はいつ書く時間を確保するか、今日は移動時間だな。など
時間を効率的に使わないと詰むって思考になって来たのがすごくいい影響を与えている気がする。
このアドベントカレンダー以外の業務などでの実装も精度とスピードを気にするようになって来たというか。
継続は力なり。(ただし中身が伴っていれば) 続けていきます。