はじめて読む8086 ノート
基本
コマンド | 書式 | 機能 |
---|---|---|
Assemble | A [アドレス] | ニーモニック入力モードへ。入力はアセンブリに変換され指定アドレス以後のメモリに挿入。 |
Dump | D [アドレス1] [アドレス2] | アドレス1からアドレス2の内容を16進ダンプとキャラクタコードで出力 |
Enter | E [アドレス] [リスト] | アドレスからはじまるリストの内容をリストで指定する値に置換 |
Go | G [=アドレス1] [アドレス2] | アドレス1からアドレス2までのプログラム実行 |
Name | N ファイル名 | マシン語プログラムの名前を指定 |
Quit | Q | 終了 |
Register | R [レジスタ名] | 全レジスタ内容と IP の示す命令を表示。レジスタ名指定でそのレジスタ値を変更できる。 |
Trace | T [=アドレス] [命令数] | 基本は R と一緒だが IP の命令を実行すると共に進める。 |
Unassemble | U [アドレス1] [アドレス2] | アドレス1からアドレス2までの内容を逆アセンブル |
Write | W | マシン語プログラムを BX と CX で指定した分だけ書き出す |
データ転送命令
MOV (受け取る側) (渡す側)
メモリからレジスタへ渡すとき「ストア」と呼び、レジスタからメモリに渡すとき「ロード」と呼ぶ。
渡す側の内容が消える訳ではないので、*nix の mv とは違う(むしろ cp)
(NOTE) アセンブリではオペランドが英数字で始まるとき、ラベルと区別するために 0 を先頭につけなければならないが DEBUG
での入力時はつけなくていい
ロードの場合、アドレスを [] で囲んで受け取り先を指定する(ポインタと同じ感覚というかポインタそのもの)
たとえば以下のコードを打ち込んで Trace してみる。
// オフセットアドレス 0200 から 11 22 33 44 55 ... を入れたとする
MOV AX,[0200]
すると、AX レジスタには「22 11」が入る。
これは 0200 から読み込まれた内容が下位バイトから順に格納されるから。
つまり、まず AL レジスタに 11 が入り、次に AH レジスタに 22 が入る。その結果「22 11」になる。 → 8086 は 16bit プロセッサなので AL, AH への読み込みは同時に行われる。
このようにバイトがクロスして入るのが 8086 系の特徴。
逆を考えてみると、今度も下位バイトから書き出される。
// AX には 22 11 が入っている
MOV [0300],AX
よって 0300 の位置にあるデータの並びは「11 22」となる。
また、同様のことがオペランドについてもいえる。
つまり、0300 というアドレスを指定した場合、メモリ上では 00 03 というカタチで格納されていて、これがアドレス用のレジスタに読み込まれる。
1ワードのデータがメモリに格納されるとき、上位と下位は逆に保存されている。
これは下位レジスタに読み込まれたあとに上位レジスタへとデータが読み込まれるため。
端的に言えばメモリは左から先・レジスタは右から先
メモリ(00 03) → レジスタ(AH AL = 00)→ レジスタ(AH = 03 AL = 00)