CPU + アドレス指定

<h1>CPU</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/5f1a601b-ea1f-10e1-d665-82b97e2a8d97.png)

CPUは制御装置と演算装置の2つの装置で構成されています。
<font color="red">制御装置</font>は記憶装置からプログラムの命令を取り出し解読し、それぞれの装置に指示を与えるコンピューターの中枢な役割を担っています。
<font color="red">演算装置</font>は算術論理演算装置(ALU)ともいい、四則演算や論理演算などを行います。
<h2>レジスタ</h2>
CPUの中にはレジスタ、という高速な記憶装置が用意されています。レジスタにはいくつかの種類があります。

|名称|役割|
|:--|:--|
|命令レジスタ|主記憶から取り出された命令を格納する|
|命令アドレスレジスタ|実行すべき命令のアドレスを保持する。プログラムカウンタともいう|
|インデックスレジスタ|アドレス指定に用いるレジスタでもあり、命令アドレス部を修飾するための増殖値を保持する。指標レジスタともいう|
|ベースレジスタ|アドレス指定に用いるレジスタであり、命令のアドレス部の値に加えられる基準となるアドレス値を保持する。基底レジスタともいう|
|アキュームレジスタ|被演算数と演算結果を一時的に保持する。累算機ともいう|
|汎用レジスタ|特定の機能に限定せず、多目的に使用される|

<h2>クロック周波数</h2>
CPUやメモリなどの各装置の動作のタイミングを合わせるために、コンピューターの内部で、一定の感覚で電圧が規則的に「高」「低」を繰り返すクロック信号が生成されています。この「高」「低」の電圧のサイクルが1秒間に何回繰り返されるかを<font color="red">クロック周波数</font>で表します。単位として、GHz(ギガヘルツ:1秒間に10⁹回)などが使われます。
CPUと主記憶を接続するシステムバス(伝送路)のクロックを<font color="red">外部クロック</font>といいます。CPU内部では、外部ロジックを数倍にした<font color="red">内部クロック</font>といいます。
パソコンのカタログにあるクロック周波数は内部クロックの周波数です。
一般に、クロック周波数が高くなるほどコンピューターの命令実行速度は向上し、処理速度も向上します。
全体の性能としては他の要素、メモリ、HDDなども関係してきます。

<h1>アドレス指定</h1>
<h2>命令語</h2>
プログラムはコンピューターに行わせる命令が集まったものです。プログラム言語で書かれたプログラムは最終的にコンピューターが理解できる1,0だけで構成された機械語に変換し、解読実行されます。
機械語の<font color="red">命令語</font>は<font color="red">命令部</font>と<font color="red">アドレス部(オペランド部)</font>で構成されますが、命令の種類によってはアドレス部が無い物や、複数あるものもあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/fe31ce2b-fd61-0fa1-79e5-db33ad0b723d.png)
<h2>命令実行サイクル</h2>
CPUは、主記憶装置（メインメモリ）に格納されている命令を読み出して解読し、他の装置に指示を出す制御装置と、データに対する四則演算や論理演算などを行う演算装置からなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/1f012045-bab1-b9c5-439a-9dfb9d07d752.png)


**①命令フェッチ(命令取り出し)**
命令アドレスレジスタで示されたアドレスの命令が、命令レジスタに取り込まれます。取り出された後、命令アドレスレジスタは、次のアドレスをさす様になります。
**②命令の解読**
命令の部分は解読器(デコーダ)により解読され、演算命令であれば演算装置に指示が出されます。
**③実行アドレス計算**
命令のアドレス部分はアドレスレジスタに送られます。アドレスレジスタは実行に必要なデータが入っているアドレスや、実行結果を格納するアドレスを計算して、主記憶装置に指示します。
**④オペランド読み出し**
演算の対象となるアドレスのデータが、演算装置に送られます。
**⑤命令の実行**
演算装置で計算が実行されます。
**⑥演算結果格納**
計算結果が、再び主記憶装置に格納されます。

<font color="red">命令フェッチ→命令の解読→実行アドレス計算→オペランド読み出し→命令の実行→演算結果格納</font>

<h2>アドレス指定</h2>
アドレス指定はアドレス装飾ともいいます。コンピューターのCPUが実行する際に、対象となるデータのメインメモリ上での所在情報を指定することをいいます。命令のアドレス部に記載されたデータと、実行時に特定のレジスタに格納された値などの組み合わせによって指定されます。最終的に決定されたアドレスのことを有効アドレスと言います。下記はそのアドレス指定方式のパターンになります。
<h3>即値アドレス指定</h3>
命令のアドレス部にデータそのものを格納している方式
<font color="red">命令アドレス部→データ</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/82bf3df0-b8a7-e3c1-625b-0d17b9519a2f.png)

<h3>直接アドレス指定</h3>
命令のアドレス部の値を実行アドレス（処理対象となるデータが、実際に格納されている記憶装置上のアドレス）とする方式
<font color="red">アドレス部の値→実行アドレス</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/ac3c8d9d-3050-c876-b6dc-04adbbaeeb2e.png)
<h3>関節アドレス方式</h3>
命令のアドレス部に実行アドレスを格納しているアドレスを格納する方式。二重、三重に行う場合がある
<font color="red">アドレス部の値→実行アドレスを格納しているアドレス→実行アドレス</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/ad893a92-d271-8700-703a-a4c3af2cf86d.png)


<h3>相対アドレス指定</h3>
命令のアドレス部の値と命令アドレスレジスタ(プログラムカウンタ)の値を計算し、実行アドレスとする方式
<font color="red">アドレス部の値 + プログラムカウンタ -> 実行アドレス</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/b3dfc24f-b862-bf16-eaad-3f5f56bfa151.png)

<h3>インデックスアドレス指定(指標アドレス指定)</h3>
命令のアドレス部の値とインデックスレジスタの値を加算し、実行アドレスとする方式
<font color="red">アドレスの値 + インデックスレジスタ ->実行アドレス </font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/7bd2201f-1d8f-5f53-e793-3f46792a6cbc.png)

<h3>ベースアドレス指定(基底アドレス指定)</h3>
命令アドレス部の値とベースレジスタの値を加算し、実行アドレスとする方式
<font color="red">アドレス部の値 + ベースレジスタ ->実行アドレス </font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/7d170798-96e1-ab71-1566-8ae2a4391a6e.png)


<h1>終わりに</h1>
参考資料
https://gihyo.jp/book/2019/978-4-297-11011-6
https://www.fe-siken.com/fehani.html
http://e-words.jp/