K氏のheboOSをまねてみる

47:Re: INT 0x09 の乗っ取り
hideyosi 10/02 13:16
feelさんドモです〜。

>CSがコードセグメント
>CSは今実行しているコードのアドレス

おぉ! 解ってきたぞ!!(feelさ、感謝)

MOV WORD[ES:0x09*4+0],IINT09
MOV WORD[ES:0x09*4+2],CS

割り込みが発生した場合のジャンプ先の情報が明記されている場所。これが割り込みベクタテーブル。(ま、よーするに、「割り込み先一覧表」ってとこね。)

で、ベクタテーブルは、割り込み番号順に、「ジャンプ先のオフセット値」と「ジャンプ先のセグメント」が書かれているわけ。

(仮にだけど、64KBしか扱わない。あるいは、32ビットとかだと、こんな面倒くさいことはしていないはず。単純に、割り込みが来たら、xxxxxxxx番地にジャンプ! みたいに、一発で解るように書いてあるはず。)

私の例のプログラムの場合、DOSでも動くようになっているプログラム。すなわち、セグメントが割り当てられているプログラム。(えーっと、MS-DOSの場合は、必ず0x100になるんだっけ?)

その内部で、サブルーチン(IINT09)を定義してある。このサブルーチンのラベルは、実際にはコンパイラがアドレスに変換するものなのだろう。

このアドレスを、ベクターテーブルに書き込む方法。それが

MOV WORD[ES:0x09*4+0],IINT09
MOV WORD[ES:0x09*4+2],CS

となるわけか。

一行目。これが、オフセット値を設定している。
で、二行目。ここに、セグメント番地を書き込む。
しかし、MS-DOSだからといって0x100とは限らないかもしれない。(仮に、MS-DOSが、いかなるプログラムでも必ず0x100セグメントで実行する!とか決まっていれば、決め打ちで書き込んでもまあ、いいかもしれないけど。)

いま動いているプログラム(IINT09のアドレスも含めて)の正確なセグメント値は、CSレジスタに保存されている。だから、CSの値を WORD[ES:0x09*4+2] 番地に書き込んでいるわけか。

なるほど!!


1-

BluesBB ©Sting_Band