知り合いの方からマシン語についてのご質問を頂いたので、
一種のデモンストレーションとして
8086のマシン語をハンド・アセンブルしてみることにする。
但し、複雑なプログラムは大変なので、
最低限 マシン語が動作していることがわかるレベル、
ということで事前に指定した一文字を画面に表示させるプログラムを作ってみる。
たった 一文字の表示であっても、
OSやBIOSに頼らず、全てをマシン語で組むのは非常に大変なので、
ここでは、安直にMS-DOSファンクションコールを呼ぶこととしよう。
これであればWindowsのコマンド・プロンプト画面、いわゆる「DOS窓」の中で実行できるハズだし、
もし、暴走してしまっても、その「DOS窓」を強制終了させれば、
Windows自体をリセットする必要もない。
ここでは、
「
MS-DOS MASM プログラミング入門」
のページに MS-DOSファンクションコールについての解説があるのでそれを参考にしてみる。
これによると、出力に1文字出力するファンクションコールは、
「AH = 02H : DL = 出力する文字コード」となっている。
この情報をもとに
アセンブラで記述してみると以下の4行になる。
mov dl, 53h ; 「S」の字の ASCII文字コード を DLレジスタにセット
mov ah, 02h ; 出力に1文字出力するファンクションコールを指定
int 21h ; MS-DOSファンクションコール
int 20h ; プログラムの終了
これをIntel の 80x86系CPUのオペコード・テーブルを使って
16進数に変換してみる。
まず、1行目の「mov dl, 53h」について。
DL レジスタに1バイトの値をセットするオペコードは「B2」で、
それに引き続き、セットしたい1バイトの値が来る。
この例では、大文字の「S」の字を表示することとして、
そのASCIIコードである 53h が来ることになる。
よって、「mov dl, 53h」の行は16進コードの「B2, 53」となる。
同様に、2行目の「mov ah, 02h」の
オペコードは「B4」で、このコードに引き続き、
出力に1文字出力する MS-DOSファンクションコール を表す
「02h」をセットする。
よって、「mov ah, 02h」の行は16進コード「B4, 02」となる。
それからファンクションコールを実行する
ソフトウェア割り込みである「int」命令のコードは「CD」であり、
直後に割り込み番号を1バイトで指定する。
MS-DOSファンクションリクエストの割り込み番号は「21」なので
「int 21h」はコード「CD, 21」となり、
その直後の、プログラムの終了を意味する
「int 20h 」がコード「CD, 20」となる。
これらを全てつなげてみると
「B2, 53, B4, 02, CD, 21, CD, 20」
となる。
では、実際の実行方法については次回のブログへの続きとしよう。
【参考リンク】
カテゴリー:
プログラミング
22:50
| コメント (0)
| トラックバック (0)