アセンブリ言語で書かれたプログラムを機械語に変換するプログラム。
アセンブラとは、アセンブリ言語で書かれたプログラムを機械語に変換するプログラムです。アセンブリ言語(=機械語に非常に近い低水準の言語のこと)と機械語はほぼ1対1に対応しているため、変換の作業もとても素直です。
身近な例で考えると、速記の記号を正式な文字に書き起こす作業に似ています。速記(アセンブリ言語)は人間がすばやく書くための記号で、それを誰でも読める正式な文章(機械語)に置き換えていく──その置き換え役がアセンブラです。
上のツールで▶ボタンを押すと、「MOV A, 5」というアセンブリ命令が、命令コードとオペランドのビット列へ変換されていく様子を確認できます。
ニーモニックとは、機械語の命令を、人間が覚えやすい英字の記号で表したものです。機械語は 0001 0000 0101 のような0と1の並びで、人間にはとても覚えられません。そこで、意味の分かる英字に置き換えたのがニーモニックです。アセンブリ言語は、このニーモニックを使って命令を書きます。
代表的なニーモニックには次のようなものがあります。
・MOV:move(動かす)の略。値をレジスタなどに入れる
・ADD:add(足す)の略。値を加算する
・JMP:jump(飛ぶ)の略。指定した場所へ処理を移す
「move なら MOV」「add なら ADD」のように、英単語を縮めた形になっているので意味と結びつけて覚えやすいのが特徴です。命令の対象になる値や場所はオペランド(=操作対象のこと)と呼び、ニーモニックの後ろに書きます(例: MOV A, 5 の A や 5)。
アセンブラは、ニーモニックを対応する機械語(ビット列)に1対1で変換します。1つのアセンブリ命令が、1つの機械語命令にきれいに対応するのが特徴です。コンパイラのように「1行が何十もの機械語命令になる」ということは基本的にありません。
機械語は、おおまかに2つの部分でできています。
・命令コード(オペコード):何をするかを表す部分(例: MOV → 0001)
・オペランド:操作の対象や値を表す部分(例: 5 → 0000 0101)
このようにアセンブリ言語は機械語ととても近い低水準の言語なので、CPUやメモリの動作を直接的に表現できます。ハードウェアを細かく制御したい場面で使われ、上のツールの対応一覧では、各ニーモニックがどのビット列に変換されるかを確認できます。
なぜ機械語を直接書かないのかを考えてみましょう。機械語は 0001 0000 0101 のような0と1の列です。CPUはこれを直接実行できますが、人間が読んでも何をしているか全く分かりません。書くのも確認するのも非常に大変です。
そこで、機械語と1対1に対応しつつ、人間にも読める英字記号に置き換えた言語が作られました。それがアセンブリ言語です。
・MOV A, 5:「A というレジスタ(=CPUの中にある小さな記憶場所)へ数値5を入れる」という意味
・ADD A, 3:「Aの値に3を加える」という意味
・JMP loop:「loopという場所へ処理を飛ばす」という意味
アセンブリ言語は機械語そのものより書きやすい一方で、どの命令が何個の0と1に対応するかを意識しながら書く必要があります。そのため、今では主にCPU内の細かな動きを直接制御したいとき(組み込み機器・OSの基礎部分など)に使われます。アセンブラは、この「人間向けのアセンブリ」を「機械向けの機械語」へ忠実に翻訳する係です。
プログラムを「人間が書ける言語」から「機械が実行できる形」へ変換するツールには、主に3種類あります。これらの違いは「何を入力として受け取り、どう変換するか」です。
| ツール | 入力 | 変換の仕方 |
|---|---|---|
| アセンブラ | アセンブリ言語 | ニーモニックと機械語を1対1に変換 |
| コンパイラ | 高水準言語(C・Javaなど) | プログラム全体を一括で機械語に翻訳 |
| インタプリタ | 高水準言語(Python・JavaScriptなど) | 1行ずつ読みながら即座に実行 |
アセンブラの特徴は「低水準言語(機械語に非常に近い言語)を入力とし、1命令が1機械語命令に対応する」ことです。コンパイラは「高水準言語(人間が書きやすい言語)を入力とし、まとめて機械語に翻訳する」点で違います。インタプリタは実行ファイルを作らず「1行ずつ読みながら即実行する」点で他と異なります。
・アセンブラ:変換比 1対1、速度は最も速い機械語を生成
・コンパイラ:変換比 多対多(1行が何十もの機械語に)、実行前に全部変換
・インタプリタ:実行ファイル不要、1行ずつ読んでその場で動かす