8086CPU アセンブリ言語概要

出典) 「MS−DOSマクロアセンブラ入門」 藤木 文彦著 ナツメ社刊

 8086CPUのアセンブリ言語の概要を掲げます。
 80286,80386,80486,Pentium のアセンブリは、この仕様を基本に、少しずつ拡張されていますが、基本となる言語の仕様は、8086に基づいています。

 なお、アセンブリ言語の仕様の中には、実際には機械語に直接対応していないが、プログラムを行う上で必要な記述を行う部分(疑似命令や、ラベルなど)がありますが、あわせて掲げます。

 本ページは、言語の概要を掲げたものですので、実際のプログラムを行う際には、専門書を参照して下さい。

 アセンブリ言語で書かれたプログラムは、機械語に変換されて、(通常の高級言語(C言語やJAVA言語)では、コンパイルと言いますが、アセンブリ言語では、アセンブルと言います。)メモリ上に格納されます。


  目次
2.0 8086CPUの内部構成
2.1 P26 CPUは機械語をどう理解するのか
2.2 P28 8086の基本構成
2.3 P32 セグメントの概念
2.4 P36 命令概説
          データ転送命令
          四則演算命令
          論理演算・シフト命令
          比較・分岐命令
          ストリング命令
          I/O命令
          割り込み命令
          CPU制御命令
          その他の命令
2.5 P45 命令の構成
2.6 P47 疑似命令とは何か
2.7 P50 システムコールとは何か


 補足(2007)
Pentium になると、大部分のレジスタの大きさが、32ビットになっている。汎用レジスタは、全て、先頭に’E’をつけて、EAX,EBX などという形での演算ができるようになった。しかし、いままで、同様に、レジスタを区切って使用できるようにもなっている。具体的には、

EAX  32ビット
AX   16ビット
AH,AL  8ビット

であり、他のレジスタも、それ以前の使用法を踏襲している。
したがって、Pentium 以前から作られたプログラムも、ほとんど修正することなく実行できる。

 そこで、本講義では、煩雑となることを避けるだめ、従来のAXレジスタのような16ビットレジスタ、および、8ビットレジスタを使用した解説を行う。
 どうしても、32ビットレジスタを使用したい場合には、従来の、
 MOV AX,BX

 MOV EAX,EBX
のような命令に変更すればよい。

 ただし、実際にこのような、アセンブリプログラムを、直接に書くことは、特殊な業務(デバイスドライバの設計など)をする場合以外には、考えにくいので、それほど、深く理解しなくてよい。
 ただ、高級言語のプログラムを行う場合でも、時に、エラー表示で、アセンブリ言語の表示がされることがあるので、読むことだけは、できた方がよいであろう。

 なお、特殊な業務以外では、アセンブリプログラムを書く必要が無い、というのに、なぜここで、アセンブリプログラムの方法を教えるのか、というと、アセンブリプログラムを勉強することが、CPUの機能、働きをよく理解することにつながるからである。

 現在、一般に売られるようになった、「デュアルコアCPU」などについては、後日説明する。

 バスの構造について

 上記の図では、データも、アドレスも同じバスを共有する形で書かれていますが、現在のCPUでは、データバスと、アドレスバスは、分離され、独立して、
 アドレスバス 32 本
 データバス 64 本

 とするのが、一般的ですが、今後さらに増えていくでしょう。
(アドレスバス 32 本 というのは、 2^32 なので、4GB までのアドレスしか、指定できませんが、特別な工夫(セグメント化)をするとか、 バスの本数を増やすなどの方法が取られることと思います。)

































































 ここでは、「データ」の置き方について解説しましたが、命令も同様に、メモリ上に置かれます。
 8086CPUでは、命令の種類によりバイト数が異なり、2バイト以外に、3バイト、4バイト、5バイトなど、様々な長さのものがあります。



















































詳細は、最初の全体構造表を参照のこと。




















 アセンブリ言語で書かれたプログラムは、機械語に変換されて、(通常の高級言語(C言語やJAVA言語)では、コンパイルと言いますが、アセンブリ言語では、アセンブルと言います。)メモリ上に格納されます。
 下記の表は、右側がアセンブリ言語で書かれたプログラム、左側が、それに対応する機械語コード(16進数)です。
 1行のアセンブリ言語に対応する機械語は、数バイトからなりますので、それを、横に並べて書きます。
 一番左側が、機械語の納められているアドレスの、先頭の値です。