要約:プログラムはなぜ動くのか 1章パート1

記事
IT・テクノロジー
本日は「プログラムはなぜ動くのか」の第一章をまとめます。今後は一章ずつこれをまとめていく予定です。
ちなみに僕みたいな素人には初見だと鬼ほど難しいので、同じようにわからなければ何度も読み返すか、ググってください。
僕は死ぬほどググってました。

プログラム実行の仕組み

プログラム始動 → クロック信号に合わせメモリから命令/データを読み出す→ 命令に合わせ演算 → 結果に応じて制御装置がPC全体を制御

これが大まかな流れになります。以下のパーツになります
・レジスタ:CPU内のメモリであり、処理対象とする命令やデータを格納しています。
・制御装置:メモリ上の命令やデータを読み出し、実行結果に合わせてデバイスを制御。
・演算装置:メモリから読みだされたデータ演算。
・クロック:コンピュータの動作タイミングとなるクロック信号を発生。クロック数が高ければ高いほど動作タイミングが早くなり多くの動作が可能になる。
・メモリ:通称Ram。命令やデータを格納している。
1バイトごとにアドレスがあり、このアドレスがメモリやデータをの場所を示している。CPUはこのアドレスをもとに命令やデータの取り出しや書き出しを行う。

プログラムを書く際に最も重要なのがレジスタ。このレジスタがプログラムのデータ処理を行っている。

大前提として、CPUとはレジスタの集合体であり、CPUは様々あるこのレジスタをもちいてデータの格納や加算を行っている。

大まかなレジスタの分類
アキュムレータ:演算を行うデータの格納
フラグレジスタ:演算処理後のCPUの状態を格納する
プログラム・カウンタ:次に実行する命令が格納されたアドレスを格納する
ベースレジスタ:データ用のメモリー領域の先頭アドレスを格納する。
インデックス・レジスタ:ベースレジスタからの総体のアドレスを格納する場所
汎用レジスタ:任意のデータを格納する
命令レジスタ:命令そのものを格納する。プログラムマがプログラム・コードでこのレジスタの値を読み書きするのではなく、CPUが内部に使用するレジスタ

基本的にプログラムカウンタ、アキュムレータ、フラグレジスタは一個ずつ、それ以外は複数個存在する。

プログラムを作成するうえで気にしなければいけないのは基本的に
・プログラムカウンタ
・フラグレジスタ
・アキュムレータ
・ベースレジスタ
・インデックスレジスタ
・汎用レジスタ
の六つ。

プログラムカウンタの役割

プログラムが実行されたとき、まずプログラムカウンタを0100と設定する。そしてCPUがプログラムを一つ実行する度、プログラムカウンタが1増加する(0100の場合0101)。CPUの制御装置はプログラムカウンタの値しだいでメモリからどのデータ/命令を選び読み取り/実行する。つまり、プログラムの流れはプログラムカウンタが決めている。
わかりずらければ(僕はかなり悩んだ)下の写真をぜひ見てみてほしい
picture_pc_7f56e9fd5925a9a0f7c482aef5983d8c.png

条件分岐と繰り返し
条件分岐命令を受けた際、CPUは
・条件に沿っていれば次行う命令は分岐先のものになる(この流れをジャンプという)。ジャンプの場合は進む先のアドレスの数値必ず元のアドレスから2以上増える(1の場合は順次進行)
・ただし、沿ってなければジャンプせず順次進行となる
繰り返しは一種の条件分岐であり、そのジャンプ先は手前のアドレスになる。
条件分岐を行うかどうかの判断はフラグレジスタが決めている。そしてここで決める際の演算は
・正・0・負
の三つに分かれている。
関数呼び出し
関数とは処理の実行、および結果の返しを行うための命令。
現実世界のたとえで言うと、仕事を外部に委託し、それが終り帰ってくる
という一連の流れを行うのが関数。
関数を呼び出すにはコール命令とリターン命令が使われる。
呼び出し自体はその名の通り「コール命令」が行う。これは、通常の条件分岐命令では、仕事でいう依頼した仕事を依頼主に返す部分が行えないから。
プログラムカウンタに関数呼び出しの入り口の命令を設定する前に関数呼び出しの次にすべき行動を「スタック」する。
スタック操作は重ねていったデータを上からとっていける構造。逆に上から以外は取れない。
データを積むことをpushと言い、データを取り出すことをpopという。
スタックと順番が逆の構造のものをキューと呼ぶ。
少し話がずれましたが、関数の処理が終了したら、最後に仕事をもとのプログラムに返すリターン命令を実行する。この命令はスタックに保存されたアドレスをプログラム・カウンタに設定する機能を持っている。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す