原点に戻って、ポインタとは?(その2)

 

前回の練習問題で、メモリ操作の話をした。今回もその続き。

 まず、準備。プロジェクト(memory_test2)を作る。これまでの操作に加えて、セクションの定義を以下の様にする。

 teratermを立ち上げて、メモリにデータを書き込む。

 メモリにデータを書き込みコマンドに「M」コマンドがある。以下の様に使用する。

 M FFE500 [ENTER]

 で、アドレス0xFFE500から順番に1byteずつデータを変更できる。以下、実行例...   データ入力の終わりは「.」

  ここで、以下のプログラムを動かしてみる。

#include < machine.h >
#include "monitor.h"

char buf[5];
int main()
{
    printf("%s\n", buf);
    return 0;
}

        ex1) 変数のアドレスは、コンパイラが自動で行う例

 

結果について、考えてみる。

  • 変数は初期化していない筈なのに、何故、値が設定されているのか?

更に、モニタの「M」コマンドで、色々データを変更し、結果がどうなるか観察してみよう。

 ex1)の例では、変数はセクションの定義に従って、コンパイラが自動配置している。「B」セクションは0xFE500から始まっているので、初期値の無いグローバル変数であるbufは、0xFE500から配置される。モニタの「M」コマンドも0xFE500からデータを書いているので、アドレスが一致する。 その結果として、bufにアクセスすると、「M」コマンドで書き込んだデータが表示されることになる。

 

 同じ要領で、直接アドレス指定ではどうなるか?

#include < machine.h >
#include "monitor.h"

#define MEMORY (*(volatile unsigned char *)0xFE500)  // アドレス0xFE500へのポインタを定義

int main()
{
    printf(“%s\n”, MEMORY);
    return 0;
}

               ex2) アドレスを直接指定する例

 ex2)の例では、アドレスはコンパイラ任せではなく、プログラマが明示的に指定している。メモリのアドレスを直接指定してデータを読み込みたい場合は、この様な方法で可能となる。

 

最終更新:2014年11月10日 13:18