CPUとメモリの動きを整理してみた

## はじめに
最近「コンピューターはなぜ動くのか」という本を読んで、散らばっていた知識が整理できました。
改めて記事としてアウトプットすることで、知識の定着を図りたく、本記事の作成を決めました。

https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B-%E7%AC%AC%EF%BC%92%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A8%E3%82%A2%EF%BC%86%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A8%E3%82%A2%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E7%9F%A2%E6%B2%A2-%E4%B9%85%E9%9B%84/dp/429600123X

## 目次
「コンピューターはなぜ動くのか」を読んでのベストバウトは以下だったので、以下について記載いたします。

- ハードウェアの構成要素
- アセンブラについて

## ハードウェアの構成要素
ここでは「COMETII」というコンピューターを例に、説明を進めていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/26b19566-4c5d-5612-9342-fac7f5034266.png)

「CPU」はコンピューターの頭脳で「メモリ」は作業台のようなものです。
そして「I/O」は周辺機器とコンピューターを接続します。
それぞれのコンポーネント間のデータのやり取りは、配線されている電線によってなされます。

例えば、「1＋2を計算するプログラム」があるとすると、
①メモリにプログラムとデータがロード
➁CPUがメモリから必要な値を読み取る
③CPUが計算結果をメモリに書き込む

みたいな過程があります。
その際のデータのやり取りが、この電線で行われます。
配線にはいろいろな種類があり、以下のような役割分担もこの配線の方法によって行われます。

- データのやり取り
- アドレスのやり取り
- 読み込みor書き込み

要するに、電線の中を流れるのはただの電気信号なので、細かい設定は配線方法に依存する。ということになります。


## アセンブラについて
アセンブラとは何ぞや？という説明は省略します。
PythonやJAVAといった言語と比べて、コンピューターが直接理解できる機械語に近い言語。という認識をお持ちください。

ここでは、「COMETII」で「1＋2を計算するプログラム」がどのように実行されるか。を説明します。
まず前提知識となる「COMETII」の構成要素の中身について確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/4e09ac22-fb67-2a46-f782-ebf7e2f16acf.png)

#### CPU
汎用レジスタ：プログラムの目的に応じた演算をします。
1＋2をする場合は、
①「1」を汎用レジスタ0にいれる
➁汎用レジスタ0上の数字に「2」を追加する

のように使用されます。

FR:3ビット用意されていて、旗のような役割を果たします。
今から説明するプログラムとは直接関係がないので、説明を省略します。

PR:次に実行する命令のアドレスが格納されます。
メモリには「プログラムとデータ」が格納されますので、次に実行する命令のアドレスを指し示します。

SP:メモリの中のスタック領域のアドレスを示します。
メモリの中には、スタックと呼ばれるデータを一時的に格納する領域がありますが、ここでは説明を省略します。

#### メモリ
図のようにメモリの中身は、箱がいくつも存在しており、それぞれに番地（アドレス）が存在します。
CPUとやり取りをする際は、この番地を用いてデータのやり取りをします。
箱の中には、データや命令が入ることになります。

####  I/O
I/Oもメモリと同様に番地が存在します。I/Oはそもそも周辺装置とコンピューターをつなぐものなので、箱の中には以下が入ります。
- 周辺機器との入力か出力を管理する設定
- 該当する周辺機器とやりとりするデータ

前提知識としては以上なので、さっそくアセンブラで作成された以下プログラムがどのように動作するか、確認していきます。また説明には「CASL Ⅱ」というシミュレーターを使用します。

```r
SAMPLE	START
	    LD	GR0,	A
	    ADDA	GR0,	B
	    ST	GR0,	ANS
	    RET
A	    DC		1
B	    DC		2
ANS	    DS		1
	    END
```
- メモリへのロード
以下がアセンブラがマシン語に変換され、メモリに格納された状態です。
「主記憶装置」の#1000~#1008番地までが、マシン語に変換されたアセンブラとなります。
さて、復習ですがメモリは**命令とデータ**を格納します。
つまり#1007番地や#1008番地には、すでに数値が格納されていることになります。このようにCPUが実行・解釈しない命令を「疑似命令」と呼びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/7aa33cf8-52d2-b31b-cbb7-4b87635f1a4e.png)

現在「PR」が#1000を指しているので、順番に命令を実行していきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/bc43eef3-0522-4d27-0821-785e9637adae.png)

今回実行した命令はLD GR0, Aですので、「AをGR0に格納する動き」になります。
そのため、「GR0」には#0001（10進数だと1）が格納されています。
また「PR」の値が#1002に変更されています。これは次のプログラム（ADDA GR0,B）が、#1002番地から始まることを意味しています。

では次の命令「ADDA GR0,B」を実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/7a394ce1-b666-1722-e6d6-20fb63125b6a.png)

以下が変化点です。

- GR0の値が#0001から#0003になった
- PRの値が#1004になった

では最後の命令「ST GR0,ANS」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/0d83ce4e-e9f1-6a2f-c6d6-5f8de918221c.png)
以下が変更点です。

- メモリ「ANS」の値が#0003になった
- PRの値が#1006になった

つまり、必要計算の結果がメモリに格納されたことになります。
次の命令「RET」でプログラムを呼び出しているOSに戻り、プログラムが終了します。

以上が一連の流れになります。
CPUとメモリで必要な情報なやり取りは、冒頭で説明した電気信号によってなされます。

## 終わりに
当方はセキュリティエンジニアとして勤務しています。（たぶん）
ニュース記事を読むとバッファオーバーフローなどといった言葉をよく目にしますが、そういったことの理解のため、「そもそものプログラムが動く仕組み」を今回まとめてみました。

今後との業務に関係のある本を読み、定期的にまとめていきたいです。

## 参考
画像は下記から拝借しました。

https://xtech.nikkei.com/it/article/COLUMN/20070404/267385/