アセンブラー

アセンブラー

1と0だけでプログラムを記述するのは、人間にとってはあまりにも過酷な作業です。そこでCPUの命令や、命令に指定する引数などを、人間にも分かりやすい名前や数値、文字列で記述する方法が考え出されました。このような記述方法を「アセンブリ言語*1」と呼び、CPUの命令を人間にも理解可能な英数字の組み合わせに変換したものを「ニーモニック*2」と呼びます。アセンブリ言語はCPUの命令と1対1に対応する人間向けの記法に過ぎないため、ニーモニックもCPUごとに異なります 。例えばCPUでZ80という8ビットのものがあります。このCPUにはザイログ系とインテル系の2つのアセンブラが存在するのです。勿論命令語のそれぞれに違ったニーモニックが対応しています。従って「機械語」同様、「アセンブリ言語」という言語が規定されているわけではありません。アセンブリ言語はあくまで人間向けの記法に過ぎないので、CPUがアセンブリ言語で記述されたプログラムを実行するには、誰かがアセンブリ言語で記述された内容をビット列に変換しなければなりません。当初、この変換は人間の手によって行われていましたが、まもなくこの変換を自動的に行うソフトウェアである「アセンブラ*3」が開発されました。アセンブラはアセンブリ言語のプログラムを読み取り、対応する機械語プログラムを出力します*4。現在でもアセンブリ言語は、CPUの機能を極限まで利用しなければならないような局面や、アセンブリ言語が唯一の開発言語となるような局面*5で、広く利用されています。
*1:assembly language

*2:mnemonic

*3:assembler

*4:これを「アセンブル(assemble)と呼びます

*5:組み込み用のソフトウェア開発など

機械語は人間が覚えて扱うのが困難なため、これを覚えやすい英単語に置き換えてプログラムを作成するためにプログラミング言語が開発されました。このプログラミング言語には低級言語と高級言語があり、パソコンつまりCPUが理解できる言語に近いものを低級言語、人間が理解しやすい言語を高級言語と分類しました。低級言語とは一般的にアセンブリ言語をいい、そのほかのプログラミング言語、C 言語やJavaなどのほとんどの言語が高級言語となります。ただし、機械語を低級言語に含める場合もあります。アセンブリ言語では、英単語に通じる「add(加算)」や「mov(転送)」などが使われます。このようにアセンブリ言語は機械語を1つずつの英単語に置き換えるプログラミング言語です。機械語をこのような文字列に置き換えたものをニーモニックと呼び、これを使って命令を記述していきます。この言語は、機械語と1対1で対応し、命令部(オペコード)と演算対象(オペランド)の値またはアドレスから構成されます。この言語は構造が単純で原始的なため習得が難しく、複雑なプログラムには向きません。そこで、これを使って作成するプログラムは単純な命令だけとなりサイズが小さくなるので、ほかのプログラミング言語に比べて実行速度は速くなります。そこで、アセンブリ言語を用いたプログラムはハードウェアの制御のためのデバイスドライバなどに利用されています。アセンブリ言語で作成したプログラムを機械語に変換することはコンパイルと呼ばずにアセンブルといい、変換する変換ソフトをアセンブラといいます。

Cseg. . . segment

Start:

. . . . . mov. . . ax,dseg

. . . . . mov. . . ds,ax

. . . . . mov. . . dx,offset msg

. . . . . mov. . . ah,09h

. . . . . int. . . . .21h

. . . . . mov. . . ax,4C00h

. . . . . int. . . . .21h

. . . . . ↑オペコード

. . . . . . . . . . ↑オペランド

int 21hは標準API です。ah,ax,dxはレジスタで、dxにmsgのアドレスを代入し、ahには09hのファンクションコードを入れています(メッセージを表示するプログラムです)。また2進数表示の代わりに16進数を使っています。たとえば、16進数”09h”は2進数”0000 1001b”です。