前回の練習問題で、メモリ操作の話をした。今回もその続き。
まず、準備。プロジェクト(memory_test2)を作る。これまでの操作に加えて、セクションの定義を以下の様にする。
teratermを立ち上げて、メモリにデータを書き込む。
メモリにデータを書き込みコマンドに「M」コマンドがある。以下の様に使用する。
M FFE500 [ENTER] |
で、アドレス0xFFE500から順番に1byteずつデータを変更できる。以下、実行例... データ入力の終わりは「.」
ここで、以下のプログラムを動かしてみる。
#include < machine.h > |
ex1) 変数のアドレスは、コンパイラが自動で行う例
結果について、考えてみる。
更に、モニタの「M」コマンドで、色々データを変更し、結果がどうなるか観察してみよう。
ex1)の例では、変数はセクションの定義に従って、コンパイラが自動配置している。「B」セクションは0xFE500から始まっているので、初期値の無いグローバル変数であるbufは、0xFE500から配置される。モニタの「M」コマンドも0xFE500からデータを書いているので、アドレスが一致する。 その結果として、bufにアクセスすると、「M」コマンドで書き込んだデータが表示されることになる。
同じ要領で、直接アドレス指定ではどうなるか?
#include < machine.h > |
ex2) アドレスを直接指定する例
ex2)の例では、アドレスはコンパイラ任せではなく、プログラマが明示的に指定している。メモリのアドレスを直接指定してデータを読み込みたい場合は、この様な方法で可能となる。