平たく言うと、
メモリアドレスを指し示す変数のこと |
メモリとは、
データの記憶装置。メモリアドレスを使って、保存データの場所を指示する |
まず、準備。プロジェクト(memory_test)を作る。これまでの操作に加えて、セクションの定義を以下の様にする。
たとえば、
char str[] = "ABC"; int main() { return 0; } |
とかしたとすると、メモリには以下の様に記憶される。
(メモリアドレスは、セクションの設定で決まる。初期値のあるグローバル変数は、Dセクションに配置される。初期値のないグローバル変数はBセクションに配置される。)
0xFFE500 | A |
0xFFE501 | B |
0xFFE502 | C |
0xFFE503 | \0 |
↑メモリアドレス
で、
char str[] = "ABC"; int main() { printf("ADDRESS=%p\n", str); // %pはポインタのアドレスを表示するオプション return 0; } |
とかして、このプログラムを実行すると、
変数は、コンパイラがセクションの設定からアドレスを計算して、メモリに割り当てる。
試しに、モニタのコマンドを使って、メモリの内容を表示してみるとどうなるか?
teratermで、
D FFE500[ENTER] としてみるとメモリを表示できる。
また、
int array[] = {0x1200, 0x002, 0x3333, 0x45, 0x5678}; int main() { return 0; } |
とかして、プログラムを動かすと、メモリは、
0xFFE500 array[0] | 0x12 | 0x00 |
0xFFE502 array[1] | 0x00 | 0x02 |
0xFFE504 array[2] | 0x33 | 0x33 |
0xFFE506 array[3] | 0x00 | 0x45 |
0xFFE508 array[4] | 0x56 | 0x78 |
0xFFE50A array[5] | ???? | ???? |
先程と同じように、モニタで確認してみよう。
ところで、メモリアドレスを直接指定してアクセスするにはどうしたらよいか?
やり方、その1 ポインタ(変数)を使う方法
int main() { int *i = (int *)0xFFE500; *i = 0x1234; printf(“%d\n”, *i); return 0; } |
やり方、その2 直接アドレス指定
#define MEMORY (*(volatile int *)0xFFE500) int main() { MEMORY = 0x5678;
printf(“%d\n”, MEMORY); return 0; } |
以上のプログラムを実行して、モニタでメモリの状態を確認する。