アセンブリ言語とは?アセンブラとの違いや需要について解説
アセンブリ言語は実行速度がとても速くメモリ効率に優れるプログラミング言語です。
アセンブリ言語を学ぶことで、効率のよいプログラミングに必要なハードウェア・プログラミングの知識、高度なプログラミング手法を学ぶことができます。
CPUなどのハードウェアで重要となる論理回路や、2種類のアセンブリ言語、基本的な命令の働き、勉強方法、アセンブリ言語とC言語の関係などを見ていきましょう。
-
Contents
アセンブリ言語とは?
アセンブリ言語は、機械語を扱いやすくするために作られたプログラミング言語です。
機械語とはコンピュータに動作を指示するプログラミング言語のなかで、CPUが直接理解できる言語です。機械語は、数字の0または1を並べた「11000011」のような人間が読み書きするのは難しい形になっているため、例えば引き算なら「101000」ではなく「SUB」(英語で引き算「subtract」の意味)を使うなど命令単位で置き換え分かり易くしたのがアセンブリ言語です。
-
アセンブラやアセンブルとの違い
アセンブリ言語の関連用語として似た響きのアセンブルやアセンブラという言葉が使われます。用語としてアセンブリと同じく英語ですが品詞が異なり、
- アセンブリ=名詞。組み立てること
- アセンブラ=名詞。組み立てる人
- アセンブル=動詞。組み立てる
使用例としては「アセンブリ言語で書かれたコードをアセンブラを使ってアセンブルする」となります。アセンブラは、アセンブリ言語を機械語へ翻訳するソフトの名称です。
-
低水準言語・高水準言語
アセンブリ言語は低水準言語の代表的な物です。低水準言語・高水準言語は、プログラミング言語の分類の一つで、人間にとって理解しやすいものを高水準言語、コンピュータが理解するのに適した機械語に近いものが低水準言語です。
機械語はコンピュータのCPUにとって直接理解できる低水準言語なため逆に人間には理解しにくい「101000」のような0と1の数字を組み合わせた数字の列(バイナリーコード)で表現される言語です。また、機械語に直接翻訳できるアセンブリ言語も低水準言語に分類されます。
対して現在の多くのプログラミング言語は、人間にとって理解しやすい「prtint(“hello”)」のような文法を備えている高水準言語となっています。高水準言語は、読みやすさ・書きやすさだけでなく、関数や変数などの便利な仕組みを多数備えているため、アセンブリ言語よりも効率よくプログラミングできます。
-
C言語との関係
C言語は1970年代にデニス・リッチーが作ったプログラミング言語で、元々は、同僚のケン・トンプソンがアセンブリ言語よりも使いやすい言語として制作したB言語を改良・発展させたものです。
当時のOSはアセンブリ言語や機械語で作られていましたが、C言語が登場したことで1973年には今のLinuxの源流となるOSのカーネル(中枢部分)がC言語に置き換えられました。C言語は低水準言語としての性質とアセンブリ言語の発展形としての理解しやすさを兼ね備えているため、OSの開発に採用できました。
アセンブリ言語だけでなく、C言語は実行時の効率が高い言語として知られています。
-
アセンブリ言語の特徴
アセンブリ言語の特徴を3つ解説します。
-
機械語に近いプログラミング言語である
-
アセンブリ言語は機械語と深く結びついています。CPUの種類によって、機械語は異なり、それぞれに対応するアセンブリ言語が存在します。
アセンブリ言語でプログラミングするには対象となるCPUの機械語がどういう機能を持っているか理解する必要があります。
また、アセンブリ言語は、見た目こそ「SUB」や「ADD」のような読みやすさを備えていますが、機械語にとても近く、 小さな処理をプログラミングするにもコード量が多くなりがちです。
-
実行速度が速い
アセンブリ言語は、ストレートに機械語へ翻訳でき、CPUが直接理解できるため実行速度が高速です。
PythonやRubyなどのインタープリタ型言語に比べると、コンパイラ型言語のほうが数段速いですが、アセンブリ言語はさらに無駄が少なく実行速度が速い傾向があります。
-
CPUの構造を理解してプログラムを組む
アセンブリ言語のプログラミングでは、言語の文法以外にCPUの構造・ハードウェアとの接続などを理解することが重要です。
アセンブリ言語はCPUの持つ能力をすべて引き出すことができる可能性を持っていますが、パワーを出し切るにはプログラマーがCPUやハードウェアを詳しく理解している必要があります。
-
アセンブリ言語を学ぶメリット
アセンブリ言語を学ぶメリットについていくつかご紹介します。
-
CPUやメモリなどコンピュータ全般の動きが学べる
-
アセンブリ言語では、CPUやメモリの挙動をすべて理解したうえでのプログラミングを求められます。
PythonやJavaScriptなど他のプログラミング言語では、意識せずにメモリを使用できます。本来必要となるメモリの準備や使用後にいらなくなったメモリを手放す処理などを、プログラミング言語がプログラマーに代わっておこなってくれるためです。
アセンブリ言語では、メモリの準備などもすべてをプログラマーが指示する必要があります。逆にいえば、他のプログラミング言語では触れることのできないメモリの操作など、ハードウェアに近いタスクをアセンブリ言語ではプログラムできるため、コンピュータの仕組みやCPUの機能をより深く学べます。
-
バグや不具合などプログラムの問題を見つける知識がつく
高水準言語と比べるとアセンブリ言語のプログラムは、コードが長い傾向があります。
プログラムにつきものの不具合(バグ)に遭遇したとき、プログラマーには問題解決が求められます。プログラムを修正するために、まずはプログラムのどこにミスがあるのか、問題箇所を特定する必要があります。
アセンブリ言語の長いコードのなかで、問題がある箇所を特定するには工夫が必要ですが、分割統治法といった大きなプログラムを分割して調べていく方法があります。プログラムを部分に分けたうえで一つ一つ実行していき、どこの部分まで正常に動作し、どこの部分から動作に不具合が出てきたかを検証していきます。
分割統治法など不具合箇所を特定する知識は、アセンブリ言語を学ぶ過程でおのずと身につくことでしょう。
-
コンピューターが計算機として演算している内容が学べる
現代のコンピュータはデジタル式なので、内部では「0」「1」のようなデジタル信号が使われています。
コンピュータの内部で実際におこなわれている処理には「0」「1」を組み合わせた2進数が多方面で使用されているため、アセンブリ言語では2進数と交換しやすい表現となる16進数が多く使用されます。
日常生活で目にする数字は10進数で書かれているので、アセンブリ言語で多用する16進数・2進数の扱いに慣れ、コンピュータが内部でどういう演算をしているのか学ぶことが重要です。
-
ハードウェア領域の論理回路の理解ができる
CPUなどのチップのなかでは、デジタルコンピュータの重要なパーツとしてAND回路、OR回路、NOT回路という論理回路が使用されています。論理回路はCPUの演算の基礎となる回路で、あらゆる種類の演算をする回路に組み込まれています。いずれも、何らかのデジタル信号を受け取り、一定の規則で別の信号を出力する回路です。
具体例として、AND回路を取りあげます。
AND回路には2つの入り口と出口が1つあります。2つの入り口には「0」または「1」を表すデジタル信号が入りAND回路を通ることで、出口から「0」か「1」の信号が出力されます。入り口が2つなので全部で4通りの入ってくる値の組み合わせがあり、組み合わせは表のようになります。
入り口1 |
入り口2 |
出口 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
アセンブリ言語の命令にはAND演算をおこなうものなどもあるため、論理回路への理解を深めるとCPUやアセンブリ言語への理解もしやすくなります。
-
プログラミングの歴史を知ることができる
現代のデジタルコンピュータは基本的に2進法に基づいて動作していますが、歴史を遡ると1940年代頃まで、計算機は10進法を使っていることが多く見られました。半導体や論理回路がなかった時代には、歯車などを組み合わせて機械式計算機を作っていたため、デジタル信号に適した「0」「1」を採用するのは稀でした。当時、かけ算・割り算ができる機械式計算機の発明者ライプニッツは、2進法の利用を提唱したといわれています。
こうした歴史や2進法の採用された経緯、計算機の構造を知るとCPUにとって何が計算しやすいのかを深く理解できるため、プログラミング言語の種類を超えて、コンピュータにとって効率がよいコードを書くにはどうするのか、という理解につながります。
現代のコンピュータで使われるプログラミング言語はいずれも最終的にはアセンブリ言語・機械語に翻訳されて実行されるため、アセンブリ言語の学習を通じて2進法や計算機の構造を知れば、幅広いプログラミングで効率のよいコードが書けるようになります。
-
アセンブリ言語のデメリット
アセンブリ言語のデメリットを解説します。
-
理解して使いこなすまでの難易度が高い
-
コードの書きやすさ読みやすさはあるものの、アセンブリ言語は機械語に近く、ソースコードが長くなる傾向があります。
また、アセンブリ言語ではCPUやメモリの操作などハードウェアを直接操作するため、ソースコードの1文ごとの意味は読めても、全体として何をしているのかを理解するにはハードウェアの理解が求められ、単に言語の文法を学んだだけでは使いこなせません。
アセンブリ言語を使いこなせるまでには、言語の学習とあわせてCPUやハードウェアの構造も学ぶ必要があるため、難易度が高くなっています。
-
ソースコードの修正に高いスキルを要する
アセンブリ言語のソースコードは長くなりがちです。加えて、他のプログラミング言語のように明確に変数や関数などの枠組みが用意されているわけではなく、ソースコードの区切りを見つけて理解するのに骨が折れることもあります。CPUにとっては効率的ですが、人間にとって変更箇所を見つけたり不具合修正をおこなうには、高いスキルが求められます。
-
アセンブリ言語に向いている人
アセンブリ言語に向いている人についてみていきます。
-
家電などの組み込み系の開発者を目指している
-
家電や産業用機器・ネットワーク機器などに使われるプログラミング言語では、アセンブリ言語が多く、C言語と組み合わせて使用されることも多いです。
こうした組み込み系分野の開発者を目指しているなら、ハードウェアにも詳しくなれるアセンブリ言語の学習はおすすめです。
-
機械語に近い領域のスキルを高めたい
アセンブリ言語を学ぶうえで重要なことは、ハードウェアやCPUの仕組みを知ることです。
CPUが内部でどういう演算をしているのか、メモリを効率よく使うにはどうするのか、というアセンブリ言語のプログラミングで必須となる知識は、他のプログラミング言語でプログラミングする際に活用でき、処理効率の高いプログラミングにつながります。
アセンブリ言語は機械語に近いため、ハードウェアレベルのプログラミングスキルを高めるにはもってこいです。
-
アセンブリ言語の基礎
アセンブリ言語の基礎について解説します。
-
低水準言語を使う意味
-
低水準言語では、対象となるハードウェアやCPUに寄り添ったプログラミングが必要となります。
低水準言語ではメモリや周辺機器に対して細かく動作をプログラミングでき、高水準言語で扱うよりもダイレクトにハードウェアを制御できます。
また、CPUの演算を機械語レベルで細かく指示できるため、プログラミングのスキルが高いほどCPUの持つ能力を最大限引き出すことができます。
例えば、組み込み機器や家電などのCPUの能力・メモリ容量が限られているハードウェアでどこまで高いパフォーマンスを引き出せるか、機械学習など大量の演算が必要なタスクでいかに無駄なく演算できるか、などの場面ではハードウェアの能力を最大限引き出せる低水準言語としてアセンブリ言語が活躍します。
-
LD命令とST命令
多くのCPUに共通する概念として、LD命令・ST命令をご紹介します。
まず、レジスタとメモリという2つのキーワードをご説明します。
- メモリはRAMやROMと呼ばれる半導体チップで、中身はアセンブリ言語からみると、例えるならたくさんの郵便受けが整列しているように見えます。それぞれの郵便受けには、個別のアドレス(番地)が紐付いているのでアドレスが分かればどの郵便受けかを特定できます。一つの郵便受けには例えば 0~255 の数字を入れる(書き込む)・取り出す(読み出す)操作が可能です。
- レジスタは、メモリと似ている点として数値を書き込む・読み出す操作ができます。メモリとの違いは、個数がとても少なく、多いものでも数百個しかありません。少ない代わりにメモリと比べてずっと高速なのが特徴です。
LD命令とは、メモリからレジスタへ値をコピーする系統の命令です。逆にST命令とは、レジスタ内の値をメモリへ書き込む系統の命令を指します。
メモリとレジスタのやりとりはアセンブリ言語の命令で基礎となります。
-
メモリに直接記述する
メモリには番地があり、1つの番地につき1つ数字が記録できるようになっています。
機械語のプログラムはメモリの中の連続した番地に書き込んだ数字の列そのものなので、原理的には数字の列を特定の番地に記入していくとCPUにとってはプログラムとなり実行できます。
近代的なOSでは、セキュリティなどの制限があるため実行できない場合がありますがWindowsの前身としてMS-DOSなどのかつて使用されていたOSの時代では実際に番地を指定してメモリに数値を書き込んで実行することがおこなわれていました。
CPUにとっては、メモリに書き込まれた数値が、単なるデータの場合もあれば実行の対象にもなります。
-
2種類のアセンブリ言語
CPUの種類により機械語は異なります。もちろん同じメーカー同士は互換性を持っていることが多いですし、人気のあるメーカーと同じ命令セットが使える互換CPUも発売されています。
以下では、2つの機械語に対応したアセンブリ言語をご紹介します。
-
COMETⅡとCASLⅡ
アセンブリ言語の入門向けに開発されたのがCASLⅡというアセンブリ言語です。
CASLⅡは、国家資格の基本情報技術者試験で出題される言語のひとつで、特定のメーカーのハードウェアを使用せず、架空のCOMETⅡというコンピュータで動くアセンブリ言語です。
COMETⅡはメモリとCPUのみに焦点を当てたハードウェアを想定しているのでシンプルにメモリとレジスタのやりとりを通じてアセンブリ言語の動きを学べます。
-
X86系
IntelやAMDなどのメーカーから発売されているCPUで使用できるアセンブリ言語がいわゆるx86系と呼ばれます。
長い歴史のなかで互換性を維持しつつ段々と命令を拡張してきたため、多数の命令があり、理解のハードルは高いですがパソコン用などで広く使用されているアセンブリ言語です。
-
アセンブリ言語の将来性
アセンブリ言語は、ハードウェアの能力を引き出す言語なので、パソコンなどでもハードウェアをコントロールするドライバを作成する際や機械学習などハードウェアの能力を引き出すため、アセンブリ言語を使用できます。
また、見た目がパソコンの形をしていない家電や通信機器など組み込み機器の分野でのプログラミング言語として一定の需要があります。
-
アセンブリ言語の勉強方法
アセンブリ言語の勉強方法としては、書籍が主流となっています。6冊の書籍をご紹介します。
・アセンブリ言語スタートブック は「CASLⅡ」のアセンブリ言語をイラストを使って初歩から解説しており、CASLⅡの理解に必要なハードウェアCOMETⅡの仕組みも図解されています。
・基礎からきっちり覚える 機械語入門 は、コンピュータの仕組みが基礎から解説されており、機械語・アセンブリ言語を通してプログラミング言語が動く仕組みを根本の所から学びたい方におすすめです。
・独習アセンブラ 新版 は、代表的な2種類のアセンブリ言語「x86」「CASLⅡ」を含む近年メジャーなアセンブリ言語それぞれに例題を出しながら解説し、練習問題を解くことで知識が身につく形式になっています。複数のタイプのCPUを解説されているため資格の勉強やいろいろな現代のアセンブリ言語を習得したい方におすすめです。
・RISC-VとChiselで学ぶ はじめてのCPU自作 は、現在スマートフォンなどで利用の多い「RISC-V」というアセンブリ言語を題材として、コンピュータの基礎から解説し、実際にRISCーV言語が動作するCPUを回路シミュレーション上で作成していくことで実際に使われているCPUの構造とアセンブリ言語を深く理解できます。
・動かしてわかる CPUの作り方10講 は、C言語を使ってシンプルな構成のCPUのシミュレーションを作ってみることからスタートしCPUの回路を設計していきCPUの仕組みを深く理解できます。上級者向けですが、モダンなCPUの構造を回路レベルで理解したい方におすすめです。
・作ろう! CPU ~基礎から理解するコンピューターのしくみ は回路図からスタートしてCPUの仕組みを解説し、CPUの回路を実際に作成するのを目指していきます。作った回路をパソコン上のシミュレーションで動かし、さらに必要な機器を用意すれば実際のチップ上で動かすこともできます。
-
まとめ
アセンブリ言語をご紹介してきました。
・アセンブリ言語は機械語に近く、CPUやハードウェアを直接操作でき、性能を引き出せる。
・アセンブリ言語を学ぶと、CPUやメモリ、デバッグなどへの深い理解ができる。
・代表的なアセンブリ言語に「x86系」「CASLⅡ」がある。
などの特徴があり、習得難易度は高いですが、家電や組込み分野で一定の需要が見込め、 アセンブリ言語を学ぶことでCPUなどのハードウェアを深い理解につながるので 普段はPythonやJavaScriptなどの高級言語を使っているプログラマーの方や基本情報技術者試験を考えている方もアセンブリ言語に触れてみてはいかがでしょうか。