はじめに
変数とかの処理のメモリ、CPUの動作、PC、マイコンで基礎的な所をメモ。
1. メモリとCPUレジスタ
-
int a = 10;とかint ary[10];。
→ これらは 基本的にメインメモリ(RAM)上に置かれます。 -
ただし、CPU が計算するときは 一時的に CPU のレジスタに載せて計算します。
例:c = a + b;- コンパイラが「a をレジスタにロード」
- 「b をレジスタにロード」
- 「レジスタ同士で加算」
- 「結果をメモリにストア」
という流れになります。
「プログラマが a という変数を書いた」 = RAM に置かれる が、
計算の瞬間だけ CPU のレジスタが使われる、という仕組みです。
2. CPU のレジスタ
- CPU 内部の「作業机」みたいな超高速の場所。
- 例えば x86 なら EAX, EBX … みたいなレジスタがある。
- これらはプログラマが直接「C言語」で指定することは基本的にできません(アセンブラなら可能)。
- どの変数をレジスタに載せるかは コンパイラが決める。
計算のとき
- CPU は RAM に直接足し算できません。
一度 CPU 内部のレジスタにロードしてから演算します。
例:
int a=3, b=5, c;
c = a + b;
アセンブリイメージ(x86風):
MOV eax, [a] ; RAMのaをレジスタeaxへ
ADD eax, [b] ; RAMのbをレジスタeaxに足す
MOV [c], eax ; 結果をRAMのcに戻す
変数a, b, cの実体はRAMにあるけど、計算の瞬間だけCPUレジスタを使っている。
3. マイコンのハードウェアレジスタ
- 「CPU内部のレジスタ」とは当たり前だが別物。
-
メモリ空間に割り当てられた特定の番地にあって、
そこに値を書いたら「ポート出力が変わる」「UARTが送信する」といったハード制御が発生する。 -
P1.DR.BIT.B3 = 1;のように書くと、RAMの変数ではなく、ハードの制御用アドレスに直接書き込みが起こる。 - だから「変数」や「スタックに置く値」とは根本的に別物。
4. まとめると
-
変数は基本 RAM
-
計算の途中で CPU のレジスタが裏で使われていただけ
-
マイコンでのレジスタ
- RAM とは別に「ハード制御用のレジスタ」が存在
-
P1.DR.BIT.B3 = 1;と書けば「特定のメモリ番地の1ビットに1が書かれる」→ LED が光る、といった世界