LoginSignup
3
3

More than 5 years have passed since last update.

Intel 8086 マシン語

Last updated at Posted at 2014-05-02

はじめて読む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)

3
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3