0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

変数等のメモリ理解めも

Posted at

はじめに

変数とかの処理のメモリ、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 が光る、といった世界
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?