ざっくりアセンブラ入門

# 書いてる人
プログラミング学習サービスやら、ペットサロン予約サービス、風俗検索サービスなど色々とやっている「かずきち」です。
■運営サービス一部
http://crazy-wp.com/
http://webukatu.com/
新宿のホストから不動産・保険の営業を経て、HTMLって何？という状態から３ヶ月独学でプログラミングやデザインを学び、IT業界で１年間実務経験を積んで年収は１本超え。現在は起業家としてサービス運営やら不動産運営をしています。
Qiita内にそれ系の記事も書いてます。
<a href="http://qiita.com/kazukichi/items/7379b75fba2f90d3cf45" target="_blank">エンジニアで稼ぐために大切な１３のコト</a>
<a href="http://qiita.com/kazukichi/items/aeba286c2a750081e5c0" target="_blank">WEBサービスで起業したい人に読んで欲しい１８のコト</a>

#アセンブラってなに？
アセンブリ言語のこと。C言語よりももっと機械に近く、機械語（１と０の世界）を人間に分かり易くした言語。
C言語などを作るための言語。
C言語には１行のプログラムには何行ものアセンブリ言語が含まれている。
洗濯機など家電に使われるマイコンと呼ばれる小さなコンピュータで使われている。
C言語などで１行で書けるものが、アセンブラだと何行も書かないといけないのでとても大変だが、
少ないメモリの中でやりくりが出来たりする。

#レジスタってなに？
CPU内にあるメモリーのこと。すごく高速だが、とても値段が高いのであまり容量はない。
他にも「主記憶装置」と呼ばれるメモリーもあり、CPU内のメモリーよりも大容量で安いが、レジスタよりは低速。
レジスタには、「次に実行する命令」「次に実行する命令のある場所のアドレス」「主記憶装置にアクセスするためのセグメント(リアルモード)もしくはセレクタ (プロテクトモード)」「レジスタと呼ばれる変数」
などが記憶されている。
32ビットCPUというのは、このレジスタが32ビットってこと。

ただ、速度差がありすぎてCPUのパフォーマンスが生かせないので、
最近では、CPUと主記憶装置（メモリー）との間に「キャッシュ」と呼ばれる主記憶装置で使われるメモリーの１０倍ほど速いメモリーが使われて、速度差を埋めている。



#メモリーって？命令が入っているってどういうこと？
命令はプログラムのこと。
私たちが何かしらの言語で書いたプログラムは、最終的には１と０の機械語になる。
１と０は結局のところは電気信号のことで、「電気送る、送らない」の羅列。
メモリーがなければ、プログラムを書いた瞬間に電気が「送る、送らない」でCPUへビビビっと送られるので、
その都度リアルタイムでプログラムを書いて動かさないといけない。
メモリーはその電気信号を貯めておける仕組み。
CPUはメモリーに貯めてある電気信号を都度受け取ることで、あらかじめ書かれた長いプログラムが勝手に処理されていく。

#そもそもコンピュータってなに？
でっかい電卓。
しかも１と０の２進数しか使えない。
でも、人間が扱う時には２進数では桁が大きくなりすぎて分け分からなくなるから、１６進数で表示して使う。

#CPUとメモリのやり取り
CPUとメモリを料理に例えると
CPU　⇒　コック
CPU内にあるレジスタ（高速なメモリ）　⇒　まな板
メモリ（主記憶装置）　⇒　冷蔵庫

レジスタに全部の命令やそれに使うための値を置いておければいいが、レジスタは高価なのでそんなに記憶容量がない。
なので、冷蔵庫に調理するために必要なもの（命令「この食材を千切りして～という手順」や値）を入れておいて、
必要な時に冷蔵庫からまな板へ移して一つ一つ調理していき、調理したもの（結果）をまた冷蔵庫（メモリ）へ保存するという流れ。

実際のCPUでは、
フェッチ・・・命令文をメモリから取り出す
デコード・・・命令文に書いてある値や命令（調理方法）の保管場所（メモリ番地）を取り出す
実行・・・命令が実行される
されていて、
「プログラムカウンタ」と呼ばれるメモリに次の命令が格納されたメモリ番地が入っていて、
プログラムカウンタにしたがって命令が取り出されている。
※プログラムカウンタは電源ONした時点で「０番地」を指すので、そこから命令が実行されていく。

#メモリの中身
メモリは基本、8bit（０か１を８個並べたもの）ごとに１区画として、１区画ごとにアドレス（番地）が振られている。

#アセンブリ、アセンブラ、アセンブル

アセンブリ言語で書かれたファイルは機械には理解できないので、言語プロセッサを使って変換する。この、言語プロセッサ（翻訳するソフト）を「アセンブラ」といい、機械語に変換することを「アセンブル」という。
徳川家康、徳川家光、徳川家継、的なややこしさ。
本当は「アセンブラ」というと機械語に翻訳するソフトのことだが、今ではアセンブラ＝アセンブリ言語になってる。

```
pushl %ebp
movl %esp, %ebp
```
みたいなアセンブリ言語をアセンブルすると

```
B8FF00
```
という機械語になる。（機械語は２進数じゃなく、16進数で表す）

アセンブルされたバイナリデータは機械が理解できる。

#アセンブリと電気回路
パソコンは結局のところ、豆電球の回路を集めたようなもの。
理科の時間にやったこんなやつ
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/31304/42743ae9-ed2e-9cda-75e4-671a5b871517.jpeg)
乾電池部分がスイッチだとして、「スイッチ入れる」「スイッチ入れない」で「１」か「０」かを表してる。

##豆電球で論理回路を作ってみる
AND回路と言われるものを作ってみる。
基本情報技術者試験とかの最初らへんに出てくる記号のやつです。
AとBという２つの入力があって、Yが出力（結果）。
AND回路の場合、AとBが両方「１」の時にYが「１」になり、それ以外は全部Yは「０」になる。
これを豆電球回路で表すとこんな感じ。

```text:
　　　　スイッチA　スイッチB
　　　　＿＿／＿＿＿／＿＿＿
　　　｜　　　　　　　　　　｜
　　　｜　　　　　　　　　　｜
　　　｜　　　　　　　　　　◎　豆電球（Y）
電源　＝　　　　　　　　　　｜
　　　｜　　　　　　　　　　｜
　　　｜＿＿＿＿＿＿＿＿＿＿｜
```
機械語で「１１」と入力すれば、「１」が出てくるみたいなイメージ。
こんな回路を組み合わせると足し算とかの計算ができる。
こういう回路が複雑にいくつも組み合わさって出来ているのがPC。（あくまでイメージだけど）
なので、中の回路によって機械語が異なる。
機械語が異なるということは、アセンブリ言語も異なる。
（使えるアセンブリ言語の命令が限られていたりする。）

#マイクロコンピュータとは？
略して、「マイコン」という。パソコンの超ちっちゃい版。アセンブリを最初学ぶにはちょうどいい機器。
CPUやらメモリやら周辺回路が１つのICチップにギュッと集積されたもので、
「ワンチップマイクロコンピュータ」とも呼ばれ、「ワンチップマイコン」ともいう。
名前ありすぎ。
マイコンの初代は「４００４」といい、その後Intel社が「８０８０」という８ビットマイコンを出して爆発的に広まった。
マイコンはこんなやつ。

その後、そのマイコンを使ったキットで「TK-80」「TK-85」というものが登場。
キーボードと表示器（元祖ディスプレイ）がついていて、そいつがパソコンの原型。

その後、16ビットの「８０８６」から「i４８６」、「Pentium」となって今に至る。

#PICと他のマイコンの違い
PICは「ハーバード型」で一般のPCは「ノイマン型」
ハーバード型では、プログラム（命令）を格納するメモリとデータを格納するメモリが別になっている。
家に冷蔵庫が２つある感じ。
（ノイマン型ではプログラムも扱うデータも一緒のメモリに格納している）


#アセンブリの記述方法
２種類ある。アセンブラによって違う。

```
1.Intel記法

[ニーモニック] [操作先] [操作元]

2.AT&T記法

[ニーモニック] [操作元] [操作先]
```
※ニーモニックはpushlとかmovlみたいな英単語っぽいやつ。

LinuxはAT&T記法で出力してくるので、そっちを使った方が良い。


... To be continued