補足資料 2


わからない、資料が変だ、等、どんな些細なことでもbummerroad@gmail.comに連絡してください。 すぐに改訂します。


znas

znas は znc からの出力を p386 の入力に変換するアセンブラである. awk(1) で書かれている. znc と同様に標準入力を読み込み標準出力に 書き出すので, ファイルを使うには,

> znas < input-file.s > output-file.p3

znc と同時に処理してしまうには,

> znc < input-file.Zn | znas > output-file.p3

のようにする.

また, _main という名前の手続きが, 対象 プログラム中に必要である.
これは C 言語の main と同様の, プログラム全体を意味する手続きで, p386 が最初に実行を開始する手続きとなる.


p386

p386 は, 386 サブセットのエミュレータで, znc と znas から出力された プログラム ( 16 進文字列で表されている ) を実行するためのプログラム である. インタフェースは, デバッガ ( 特に MS-DOS の DEBUG.EXE ) の それに似させている.
p386 からの出力は, エミュレータからの出力は標準エラー出力に, 対象 プログラムからの出力は標準出力に出力している. 終了時には終了直前の エミュレータの状態が出力 ( 例 : HALT 命令で終了 → "HALT", 対象プログラムを実行中 → "RUNNING", 実行前の初期状態 → "INIT" ) される.

> p386 input-file.p3

のようにして実行する.

すると, 以下のような画面が出てくる

EAX:00000000 EBX:00000000 ECX:00000000 EDX:00000000
EBP:00000000 ESP:c0000000 EIP:00000000 Zero:FALSE Sign:FALSE OverFlow:FALSE
[EIP]:e8

これは, 各レジスタの状態を表示している. 最後の [EIP]:e8 は, EIP レジスタ ( インストラクションポインタ ( プログラムカウンタ )) が指しているバイトを表示しており, 386 の命令コードがわかる 資料があれば, いちおう参考になる. ( ちゃんとしたデバッガなら, ニモニックを表示するのだが, 特に x86 系のプロセッサの場合は ニモニックを生成する手間が大きいので実装していない )

ここで, 単に改行のみを入力すると, エミュレータへのコマンド一覧が表示される.


--- [s]tep [g]o [b]reakpoint [c]lear [q]uit ---

各コマンド語の先頭の 1 文字を入力して改行を入力すると, エミュレータは コマンドを実行する. 各コマンドの意味は以下の通りである.

[s]tep : 1 命令のみ実行する

[g]o : 連続実行する

[b]reakpoint : ブレークポイントを設定する. 386 には INT3 という ニモニックの特殊なソフトウェア割り込み命令があり, この命令は 1 バイト ( 0x55 ) で, 番号 3 のソフトウェア割り込みを発生する. エミュレータはこの命令を見つけると, 実行を中止し, コマンド 待ち状態になる.

[c]lear : ブレークポイントをクリアする. ちゃんとしたデバッガでは, 複数のブレークポイントを指定したり, ブレークポイントを置いた場所からの 実行再開の場合には中断されなかったりといった機能があるが, p386 には 一切無い.

[q]uit : 実行を中断して p386 を終了する