ねこめもmkII(マークツー)

本家ねこめも (http://nekomemo2.site)の補助用。 主に勉強ネタ。

疑問のまとめ(途中)

本書を読んでそういうものとして次に進んだけど、やっぱり納得できなくてもう一度調べ直したもの。
引用箇所を自分用にわかりやすくまとめています。
徐々に増やしていく予定。

●全体
言語を基準にした目次
http://hrb.osask.jp/wiki/?prog_index

 前に出てきた命令なんかを忘れたときに見返すとやりやすい。

●2日目
ADD CX, 0x1234 は 81 C1 34 12 という4バイトの命令だが、
ADD AX, 0x1234 は 05 34 12 という3バイトの命令。

機械語に直してみると本当にそうなってる。
1234が34 12になってしまうのと同じように、そういうものらしい。
nasmでコンパイルしてみるとわかる。
http://road-of-os.blogspot.com/2007/10/2makefile1.htmlを参照

 ●4日目
http://hrb.osask.jp/wiki/のq_aから抜粋)
<問い>
write_mem8という関数をアセンブラで作っていますが、MOV ECX,[ESP+4] MOV AL,[ESP+8]というところが分かりません。
なぜ[ESP+4]にアドレスが入っていることが分かったのでしょうか?
そしてなぜ、[ESP+8]にデータが入っていることが分かったのでしょうか?
また、p.70に「C言語でwrite_mem8が使われると・・・そして、その時に指定された数字はメモリにメモしてありまして、それぞれ
1番目のもの:[ESP+4]
2番目のもの:[ESP+8]
3番目のもの:[ESP+12]
4番目のもの:[ESP+16]
とありますが、コレは
1番目にVRAMのアドレス、
2番目に15、
3番目にまたVRAMのアドレス、
4番目に15ということでしょうか?
そして値が4増えていっているのは32ビットモードだからでしょうか?

<回答>
簡潔に言えば、なぜ分かったのかというと、tolset内のコンパイラは自分で(=著者自身が)作ったコンパイラだからです。
自分で作った以上、メモリのどこに格納されるような機械語になるかは当然分かっていたわけです
(まあ他の人が作ったコンパイラもたいていは同じですが)
そして[ESP+4]と[ESP+8]についてはそのとおりですが、今回のwrite_mem8には3番目や4番目の数値はないので、[ESP+12]や[ESP+16]に書かれている値がどんなものかはわかりません。
値が4ずつ増えるのは、そうなるようにコンパイラを作ってしまったからというだけの理由で、32bitモードかどうかは直接は関係ありません

●12~13日目
割り込みハンドラ、FIFOバッファって何だっけ?
FIFOの基本的な説明は6日目に戻って読む。
(ファイルの分割についても6日目、結構重要な日)
さらに詳細は7日目。
FIFOについては以下の説明が詳しく、わかりやすい。
http://bttb.s1.valueserver.jp/wordpress/blog/2018/01/01/makeos-7-2/

FIFOバッファそのものの詳細は以下。
(30日本を読んでる方なのでわかりやすい)
http://uchan.hateblo.jp/entry/2019/05/03/220443

●15日目
「*8」の正体
現在動いているタスクの GDT番号x8倍(←ここがインテルの仕様)
http://osjisaku30.g.hatena.ne.jp/bluespear/20060812
https://yuyubu.hatenablog.com/entry/2018/06/07/30%E6%97%A5OS%E8%87%AA%E4%BD%9C%E6%9C%AC16%E6%97%A5%E7%9B%AE

selはGDTの番号のこと
https://kobapan.hatenadiary.org/entry/20090518/1242644719