【漫画でIT入門】「とあるIT企業の社員活動日誌」第18話「プログラミング学習のすゝめ④ アセンブリ言語とは?」

パソコンを使う人のありそうでなさそうなお話や、ガジェットのお話を漫画で紹介させていただくコーナーです。

とあるIT企業に務める彼女たちは日々楽しく真面目に業務に励んでいます。その中で、起こったハプニングや困った事などを活動日誌を通して覗き見していきましょう。

※当ブログは、アフィリエイトプログラムに参加して商品を紹介しております。当ページのリンクを介して商品を購入すると著者に収益が発生することがあります。

【漫画で入門】「とあるIT企業の社員活動日誌」各話一覧はこちら



アセンブリ言語とは?

コンピューターの動作を制御するためには、CPUに命令を送ります。

そしてCPUが理解するのは「機械語」と呼ばれる言語で、2進数と呼ばれ「0」と「1」の数字だけでできた羅列です。

この機械語は人が理解することはできませんが、人が理解しやすいようにしたものが「アセンブリ言語」です。機械語に1対1で対応して文字にしたプログラミング言語で、機械語にとても近い言語と言えます。

アセンブリ言語は機械語により近いプログラミング言語であり低級言語の代表格と言えます。

低級言語は特定のCPUに特化した仕様のため、それ以外のCPUでは動作しない特徴があります。しかし、その分だけ細かい動作まで定義できるメリットがあります。

アセンブリ、アセンブル、アセンブラ、とは?

アセンブリ言語について調べていると、「アセンブル」や「アセンブラ」という言葉に出合うかもしれません。これとアセンブリ言語とは何が違うのでしょうか?これらの違いは英語に直すと意味を理解しやすくなります。

アセンブリ:assembly(組み立て、名詞)
アセンブル:assemble(組み立てる、動詞)
アセンブラ:assembler(組み立て、名詞)

アセンブリ=言語の名称。ソースコードそのもの。
アセンブル=コンパイラ。人語を機械語に翻訳してくれる装置。
アセンブラ=機械語に変換する行為。

「アセンブリ言語をアセンブルを使用してアセンブラする。」

ニーモニックやオペコードとは?

アセンブリ言語を勉強していると様々な専門用語が出てきます。

その代表として「ニーモニック」や「オペコード」などが存在します。アセンブリ言語では、CPUへの命令名やデータを格納するアドレス、変数名や数値となるパラメーターが必要ですが、それらの名称がその他のプログラミング言語とは異なるだけです。

  • ニーモニック(アセンブラコード):一つ一つの命令
  • オペコード(オペレーションコード):ニーモニックの先頭の命令を表す単語
  • オペランド:オペコードがとる引数パラメーター

 

メモリやレジスタとは?

アセンブリ言語はCPUのメモリやレジスタに大きく影響されるプログラミング言語になります。

簡単にメモリとレジスタについてお話していきます。

メモリについて

機械語やデータなどはすべてメモリに配置されます。メモリは下の図のようなアドレスとその内容が入る場所の2つ

組の配列が並んでいるイメージになります。

これは、あくまでも例です。この例では3つの配列ですが、実際にはこのセルは上下にずっと続いています。内容の部分は8ビットです。よって16進数で2桁の数が入ります。アドレスには連続した値が入ります。

レジスタについて

CPUにはデータを操作するための変数のようなレジスタと呼ばれるデータを格納する場所がいくつか用意されています。一般的なプログラム言語の変数はプログラマが自由に名前や用途を決めることができ 数にも制限はありませんが、レジスタはCPUの中にあらかじめ決められた個数だけ用意されていて名前とその用途も決まっています。

メモリとレジスタの違いに注意してください。メモリはパソコンの組み立てのときに見たようにCPUの外側にある装置です。レジスタはCPUの内部にありメモリよりもはるかに高速に動作します。また、記憶だけではなくデータを操作するためにも使います。

レジスタには以下のようなものがあります。

他にもありますが、ここでは省略します。

ここでは主に32ビットのレジスタを使います。16ビットや8ビットのレジスタは、昔のCPUと互換性をとるためにあると考えてよいでしょう。昔のCPUは8ビットだったのでレジスタも8ビットでした。

次にレジスタの主な用途を説明します。ただし、ESP以外は汎用としても使えます。

アセンブリ言語の基本文法

まず、アセンブリ言語の記述構文は、「AT&T形式」と「Intel形式」の2つが主流です。

仕様により構文が異なります。

  • AT&T構文とIntel構文ではソース・オペランドとデスティネーション・オペランドの順序が逆です。
    • Intel: mov eax, 4
    • AT&T: movl $4, %eax
  • AT&T 構文では即値オペランドの前に $ が付きますが、Intel 構文では付きません。
    • Intel: push 4
    • AT&T: pushl $4
  • AT&T 構文ではレジスター・オペランドの前に % が付きますが、Intel 構文では付きません。

今回はIntel構文を基準に基本文法をご紹介していきます。

アセンブリ言語の基本文法は前述している通り非常にシンプルです。しかし、一つの命令で一つしか実行できません。その為他のプログラミング言語よりもコード全体の記述量は圧倒的に多いです。

前述のシンプルなアセンブリ言語についてみていきましょう。

基本の用語は前述でも説明している通りです。

まず、文頭に命令コードである「オペコード」を記述し、その後ろの引数となる「オペランド」を記述します。

上記のコードではオペコードである「mov」を記述しています・「mov」は第一オペランドに第二オペランドを代入するオペコードになります。つまり上記の命令では第一オペランド「eax」に第二オペランドである「4」を代入する命令になります。ここの「eax」はレジスタで説明した32ビットレジスタの「EAX」です。用途も説明してますので差参照してください。

このように処理をつなげて一つのシステムを作り上げるのがアセンブリ言語になります。

「オペコード」はmov以外にも多くありますので各自で確認してみてください。また、この文法の説明はかなり入門です。さらに深く勉強してみたい方は書籍などを参考にしてみてください。

アセンブリ言語とC言語の比較

簡単にアセンブリ言語がどれだけ長いコードで成り立っているのかC言語と比較にしてみてみましょう。

プログラミング言語の入門でよくある「Hello World!」の出力を記述します。

section .data
    msg db      "Hello world!"

section .text
    global _start
_start:
    mov     rax, 1
    mov     rdi, 1
    mov     rsi, msg
    mov     rdx, 12
    syscall
    mov    rax, 60
    mov    rdi, 0
    syscall

まず上記がアセンブリ言語での記述です。次にC言語で記述します。

  #include <stdio.h>
  
  int main() {
      printf("Hello World");
      return 0;
   }

一目見るだけで記述量の違いが判ると思います。アセンブリ言語は一つはシンプルな文法をしていますが全体でみるとかなり複雑で長いコードになっていまう言語だと言えるでしょう。

アセンブリ言語を勉強するメリット

アセンブリ言語は現在では開発の現場ではあまりみることはないかもしれません。また、非常に理解が難しい言語です。そのため、アセンブリ言語を勉強する必要性は少ないのかもしれません。しかし、アセンブリ言語を勉強するメリットはあります。

コンピュータの動きを理解することができる

アセンブリ言語は、コンピューターを動かす脳ともいえるCPUの動きを、1対1のコードで命令する言語です。

ですので、CPUがどのように動き、その他メモリーや周辺機器にどのような命令をするかをすべて把握する必要があるのです。

コンピューターには、中心となるCPUをはじめメモリーやHDD(SSD)、周辺機器を含めさまざまな機器で構成されています。

コンピューターが通電すると、そのあとのコンピューターの行動はすべてCPUが動きを制御するのです。

CPUは電気信号のパターンでその他の機器を操作するのですが、「どのような操作をするか」という命令するコードを指示するのがプログラミング言語です。

アセンブリ言語は、言語の中でももっとも機械語に近い言語ですので、CPUに制御してほしい順番を、順序立てて細かくコーディングしなくてはなりません。

このような意味でも、アセンブリ言語を駆使するアセンブラプログラミングは、コンピューターを深く学べる言語だと言えます。

プログラミング言語をより深く理解することができる

コンピューターの仕組みを理解できると、プログラミング言語のそれぞれのコードが何のために存在しているのかが分かってきます。

どのような言語も、すべてはCPUに仕事をさせるための命令の塊です。

ですので、コンピューターの動きを意識するアセンブリ言語を理解することで、あらゆるプログラミング言語が深く理解できるでしょう。

まとめ

アセンブリ言語は数あるプログラミング言語の基礎となる言語かもしれません。他のプログラミング言語よりもより機械に近い場所にある言語です。その為、実際に使用する機会も少なければ、言語の難易度としても高い言語になってしまいます。

しかし、アセンブリ言語を理解することが出来れば他の言語をより深く理解でき、コンピュータをより近くで操ることができるでしょう。

初めてプログラミング言語を勉強する方にはあまりおススメしませんが、他の言語を習得した後にさらに深く理解するためにアセンブリ言語を勉強するの良いことではないでしょうか。

漫画作者紹介

たんれ~ イラスト

たんれ~

イラストレーター兼漫画家
主にインターネットの海で女の子を描くのが好きな人
猫派よりも犬派

Twitter:@tanrei0303

Pixiv:tan0

漫画作者のコメント

プログラミング言語は0や1の数字の羅列で命令すべき動作を言語として変換して命令できるようにする為に生まれた言語です。

その為、命令できる内容が単純なものしかなく、複雑な命令を行うのに入力する命令文が増えてしまいます。しかしながら、ハードウェアが動作する動きを理解しやすく、しっかりと理解すれば他のプログラミング言語を理解するのに役立ちます。

プログラミングの概念みたいなものですね。

高級言語と呼ばれるプログラミング言語は複雑な命令を少ない文章で表現することもあり、「なぜこれで動くの?」と疑問に思うケースもあると思います。アセンブリ言語はそういった省略されている部分を一つ一つ文章にすることで動作するので、理解が深まる、という事ですね。

正直ちゃんと理解するのにかなり頑張らないといけないかもですが、自分のモノにできればかなり役に立つと思いますので、頑張ってみてください。

さらに学べるおすすめ書籍

独習アセンブラ 新版

基礎からきっちり覚える 機械語入門 

ARMで学ぶ アセンブリ言語入門

アセンブリ言語スタートブック