AKI-H8用スタート
アップルーチンの役割学習
H8/3048-fone版
Copyright(C) 30Sep2008
coskx
【1】はじめに
問題の設定
プログラム中で変数はRAMとROMのどちらにおかれるのか。
もし,RAMに置かれたら,プログラム中から変数の値の変更は可能だけれど,電源を切ると,保存内容
が失われるため,初期値を持った変数は,初期値を保つことができない。
もし,ROMにおかれたら,電源が切れても,値を保つことができるので,初期値を保つことができるが,
プログラム中から変数の値を変更することはできない。
H8/3048foneのCプログラミングの時のスタートアップルーチンの役割を,未完成のスタートアップルーチンから学ぶ。
同時に,コンパイラ,リンカの役割も学ぶ。
作業は評価版コンパイラVer2が設定されたPC上で行なう。
すでにC言語によるプログラム,アセンブリ言語による簡単なプログラムを習得
してから読むこと
参考 H8/3048foneのメモリマップ
メモリの
種類アドレス 備考 ROM 0x00000-0x1FFFF
(128kbyte)実際にはフラッシュメモリ,書き込みモードでのみ書き込むことが 出来る。
電源が切れても,内容は保たれる。プログラム中で値を変更できない。
割り込みベクタテーブル,プログラム,定数,変数の初期値の格納場所RAM 0xFEF10-0xFFF0F
( 4kbyte)電源が切れると内容は消滅する。 プログラム中で値を変更できる。
変数,スタック(オート変数,戻りアドレス,レジスタ退避)の格納場所
ここに書かれた以外のアドレスには,メモリは実装されていない。
【2】LEDの点滅プログラムと原始的スタートアップルーチン
2.1 LED点滅Cプログラム
次のLEDの点滅Cプログラムでは関数呼び出し(サブルーチン呼び出し)を用いている。
このため,Cプログラムが実行される前にスタックポインタの設定が必要である。
スタックはRAMの最後尾におかれ,メモリの後ろから若いアドレスに向けて使用されるので,
通常スタックポインタにはRAMの最後尾のアドレスが設定される。
ex1.c (LED点滅プログラム)
/* msecwait関数で1秒ごとのLEDのON-OFFを行う */
#include <3048fone.h>void msecwait(int msec)
/*msec間なにもしない時間稼ぎ関数*/
{
int i,j;
for (i=0;i<msec;i++) {
for (j=0;j<2646;j++); /*2646は実測によって求めた値*/
}
}main()
{
/*P5の下位2ビットを出力に設定*/
/* P5のDDRの下位2ビットに1を与えるとこの設定になる*/
/*DDRとはDataDirectionRegister(データ方向設定レジスタ)*/
P5.DDR = 0x3; /*0x3 = 00000011(二進数)*/
while(1) {/*これは無限ループ*/
/*LED0をONにする P5のDRの第0ビットを1にする*/
/*DRとはDataRegister(データレジスタ)*/
P5.DR.BIT.B0=1;
/*LED1をOFFにする P5のDRの第1ビットを0にする*/
P5.DR.BIT.B1=0;
msecwait(1000);/*1000msecの間なにもしない*/
/*LED0をOFFにする P5のDRの第0ビットを0にする*/
P5.DR.BIT.B0=0;
/*LED1をONにする P5のDRの第1ビットを1にする*/
P5.DR.BIT.B1=1;
msecwait(1000);
}
}
2.2 スタートアップルーチン
マイクロコンピュータは電源を入れると起動し,プログラムを実行しているが,
起動時にすぐに開発したCプログラムを実行するわけではない。
(H8CPUは,起動時に,メモリの0番地から3番地にかけての4バイトに書いてある値を,実行開
始アドレスとするようにできている)
マイクロコンピュータ起動後,Cの関数mainを呼び出すまでのことを記述したプログラムは
「スタートアップルーチン」と呼ばれている。
スタートアップルーチンの仕事は,以下の3つである。
(1)スタックポインタ(実際にはレジスタER7)にRAMの最後尾アドレス(H'FFF10)を設定
(2)mainをサブルーチンとしてコール
(3)この例のmainは永久ループなので,終了しないが,終了してしまうようなmainの場合は
サブルーチンリターンとして戻ってきてしまうので,スタートアップルーチン内で永久ループする
H8CPUは,起動時に,メモリのアドレス0(0番地から3番地にかけての4バイト)に書いてある値を,実行開
始アドレスとするようにできているので,メモリのアドレス0(ROM領域)にはスタートアップルーチンの先頭
アドレスを書いておかなければならない。
原始的なスタートアップルーチンと起動時の開始アドレスを含むファイルは次のように作る。
スタートアップルーチン start00.src
.CPU 300HA ;CPUは300Hシリーズアドバンストモード
.IMPORT _main ;mainはこのファイル以外に定義されているのでそれをつかえという意味
.SECTION A,DATA,LOCATE=H'000000
RSTVEC:
.DATA.L START ;アドレス0にスタートアップルーチンのアドレスを書いておく.SECTION P,CODE,ALIGN=2 ;ここがスタートアップルーチンの先頭
START:
MOV.L #H'FFF10,ER7 ;スタックポインタ設定
JSR @_main ; Call main()
EternalLoop:
BRA EternalLoop ;万が一戻ってきても永久ループ.END
ここで
.SECTION A,DATA,LOCATE=H'000000
というのは,セクションAが0番地から始まり,次の行からはセクションAの記述であるという意味であり,
.SECTION P,CODE,ALIGN=2
というのは,セクションPがここからはじまり,次の行からはセクションPの記述であるという意味である。
ALIGN=2
というのは,プログラムを機械語に変換した際,機械語プログラムは偶数番地から始まりなさいという
意味である。セクションPはスタート番地が指示されていないので,後でリンカが具体的アドレスを決める。
START
はSTART:というラベルで定義されているのでアドレスを表している。しかしこの段階ではまだアドレス
は割り当てられていないので,後でリンカが具体的アドレスを決める。
2.3 プログラム作成から,実行まで
Cプログラミングでは,Cのプログラムを作成して,コンパイラに処理してもらえば,実行の準備ができていたが,
舞台裏では,Cプログラムを中間形式のプログラムに変換し,それにライブラリ(静的ライブラリ)を合体させて,
実行できる形式の機械語プログラムを作らせていた。
(1) Cコンパイラを使って,Cプログラムをアセンブリソース(アセンブリ言語)に変換
(2) アセンブラを使って,(1)でできたをアセンブリソース(アセンブリ言語)を機械語ファイル(単体では実行不能)に変換
(プログラムの先頭アドレスはまだ定まっていない)
(3) アセンブラを使って,スタートアップルーチン(アセンブリ言語)を機械語ファイル(単体では実行不能)に変換
(4) リンカを使って,(2)(3)でできた2つの機械語ファイルを実行可能な機械語ファイルに変換
(リンカスクリプトによってプログラムの先頭アドレスが決まる)
(5) コンバータを使って,(4)でできた実行可能な機械語ファイルを転送可能なテキストファイルに変換
(6) 転送ツールを使って,(5)でできたテキストファイルをH8マイコンに転送
(7) プログラム書き込みモードで起動したH8マイコンは転送されてきたテキストファイルに基づいて,
メモリ内の指定されたアドレスに機械語を置く
2.4 リンカとリンカスクリプト
リンカはスタートアップルーチンとCプログラムを結合し,アドレス配置を決定する。
コンパイラでファイルex1.cをコンパイルし,出力されたアセンブリコードファイルex1.srcをみると,
アドレス未決定の「セクションP(プログラムコード)」がある。
そこで,セクションPをアドレスH'100から配置するようにリンカスクリプトを書く。
リンカスクリプト ex1.sub
START P(100)
EXIT
さらにセクションAの先頭(0番地)にはラベルSTARTを表すアドレスが4バイトで書かれていることになる。
すなわち0番地に100(HEX)が書かれていることになり,CPU起動時には100(HEX)から実行が始まる。
アドレス
内容
0から3までの4バイト
0x100が起動アドレスとして書いてある。
なにも記述していない。
0x100から
スタートアップルーチンのセクションP
この中でmainの先頭にサブルーチンコールしている
mainの先頭
自分のプログラム
リンカスクリプト中の「START P()」はリンカスクリプトのキーワードで,セクションPの機械語コードをこの番地から書き込めるよう
具体的手順
(1)シリアルケーブルでマイコンをPCとつなげる
(2)マイコンを書き込みモードで立ち上げる。
(3)「ex1.cmd」をダブルクリック,書き込み終了まで待ち,マイコンの電源を切る。
(4)マイコンを実行モードで立ち上げる。
コンパイル用windowsスクリプト ex1.cmd
rem カレントドライブ・カレントディレクトリへ移動
%~d1
cd %~p1rem コンパイラのパスの設定など
path=%path%;%HOMEDRIVE%\Program Files\h8v2\bin;%HOMEDRIVE%\Progra~1\h8v2\WRITER\maeda
set h8inc=%HOMEDRIVE%\Progra~1\h8v2\include
set h8library=%HOMEDRIVE%\Progra~1\h8v2\lib\c38ha.lib
rem コンパイル&アッセンブル
ch38 -cpu=300ha -include=%h8inc% -OUTCODE=SJIS -CODE=ASMCODE ex1.c
asm38 ex1.src
asm38 start00.srcrem リンク
lnk start00.OBJ ex1.OBJ -subcommand=ex1.sub -LIB=%h8library% -O=ex1 -P=ex1rem Sフォーマットに変換 xxx.motの作成
cnvs ex1.abs転送(省略)
pause
ここで取り上げたコンパイル用windowsスクリプトex1.cmdの概要は次の通りとなる。
path=... windowsのpath設定
set windowsの環境変数設定
ch38 コンパイラ ここではex1.cをコンパイルして,ex1.srcを生成する
・入力
ex1.c Cプログラムソースファイル
・出力
ex1.src アセンブリ言語ソース(テキストエディタで読める)
(Cソースファイルがどのようにアセンブリ言語に変換されたかわかる)
ex1.lst リスト(テキストエディタで読める)
asm38 アセンブラ ここではex1.srcからexi.objを,start00.srcからstart00.objを生成する
・入力
ex1.src アセンブリプログラムファイル(コンパイラが作成したもの)
・出力
ex1.OBJ 機械語中間ファイル
・入力
start00.src アセンブリプログラムファイル(スタートアップルーチン)
・出力
start00.OBJ 機械語中間ファイル
link リンカ start00.OBJ,ex1.OBJから機械語ファイルex1.absを生成
・入力
ex1.sub リンカスクリプト(リンカへの指示が書いてある)
start00.OBJ 機械語中間ファイル(アセンブラの出力したもの)
ex1.OBJ 機械語中間ファイル(アセンブラの出力したもの)
・出力
ex1.ABS 実行形式機械語ファイル
ex1.MAP マップファイル(テキストエディタで読める)
(関数のアドレスや静的変数のアドレスが判る)
cnvs コンバータ ex1.absから転送形式テキストファイルex1.mptを生成
・入力
ex1.ABS 実行形式機械語ファイル(リンカが出力したもの)
・出力
ex1.MOT 転送形式機械語ファイル(テキストファイルなのでテキストエディタで読める)
転送プログラムでex1.motがマイクロコンピュータに転送されたときに,マイクロコンピュータ内のメモリは次のようになっている。
この状態は今のところ,観察の方法がない。(【6】で観察する)
メモリ 内容 説明 0(Hex)から
3(Hex)100(Hex) マイクロコンピュータは,電源起動時に,0番地に書いてある値を起動先頭番地として
プログラムカウンタ(PC)に書き込んで動作を始める100(Hex)
から
セクション
Pの内容セクションPはスタートアップルーチンファイル内に記述されている。
またCプログラムファイルの実行部はコンパイラによってセクションPに設定されるため,
セ クションPはスタートアップルーチンとCのmain部によってできている。リンカへの指
示順において,スタートアッ プルーチンの方が先なので,セクション Pではスタートア
ップルーチンが先で,そのあとにCのmainが置かれる。よって100番地からはスタートア
ップ ルーチンが置かれている。スタートアップルーチンの終わりのところで,Cのmainへサブルーチンコールジャンプし
ている。
課題1 実際に動作させなさい。
(1)ex1.MAPファイルを調べ,関数main,関数msecwaitのアドレスを調べなさい。
(2)次にex1.subの内容でSTART P(100)をSTART P(200)に変更し,動作させ,
ex1.MAPファイルを調べ,関数main,関数msecwaitのアドレスを調べなさい。
(3)ex1.srcファイルを調べ。関数msecwait内で使われている変数はどのような領域に
あるのかあるいはどのようなレジスタがつかわれているのか推測しなさい。
その他気づいたことを述べなさい。
(sup01.txt)
ex2.c (LED点滅+ループ回 数表示プログラム)
/**********************************************************
msecwait関数で0.25秒ごとのLEDのON-OFFを行う
**********************************************************/
#include <3048fone.h>
#include "h8_3048fone.h"void msecwait(int msec)
{
int i,j;
for (i=0;i<msec;i++) {
for (j=0;j<2646;j++); /*2646は実測によって求めた値*/
}
}int count1=1000;
int count2;main()
{
int count3=3000;
count2=2000;
initSCI1(); /*シリアル通信ユニットSCI1の初期化*/
initLed(); /*LED初期化*/
while(1) {
SCI1_printf("%5d %5d %5d\n",count1++,count2++,count3++);
turnOnLed(0); /*LED0のON*/
turnOffLed(1); /*LED1のOFF*/
msecwait(250);
turnOffLed(0); /*LED0のOFF*/
turnOnLed(1); /*LED1のON*/
msecwait(250);
}
}
Cのプログラマなら,実行結果を次のように期待している。
コンソールでの実行予想
左から順にcount1,count2,count31000 2000 3000
1001 2001 3001
1002 2002 3002
1003 2003 3003
1004 2004 3004
1005 2005 3005
スタートアップルーチンとして【2】で作ったstart00.srcを使う。
3.2 コンパイルと生成されたアセンブリソース
コンパイル後にできるex2.srcファイルをみると,アドレス未決定のセクション「P,C,D,B」がコンパイラによって作られているのがわかる。
count1は初期化(変数定義時に値が代入されている)されているのでセクションDに,
count2は初期化されていないのでセクションBに,
count3はレジスタE3に割り当てられているのがわかる。
まずは,リンカスクリプトで,P,C,DをROM領域(H'100~)に割り当て,Bを
RAM領域(H'FEF10~)に割り当ててコンパイルリンクしてみよう。
(ROM領域(H'100~)では,P,C,Dの領域が,この順番で詰めて配置される)
リンカスクリプト ex2.sub
START P,C,D(100),B(0FEF10)
EXIT
参考
セクションP:プログラムコード領域
セクションC:定数領域 (Cプログラムではprintfの書式文字列など)
セクションB:初期値を持たない静的変数領域 (上記Cプログラムではcount2)
セクションD:初期値を持つ静的変数領域 (上記Cプログラムではcount1)
静的変数とは,グローバル変数(関数の外に定義されている変数)やstatic修飾された関数内変数のことである。
コンパイルからマイコンへの書き込みまでのwindowsのスクリプトは次のようになる。
具体的手順
(1)シリアルケーブルでマイコンをPCとつなげる
(2)マイコンを書き込みモードで立ち上げる。
(3)「ex2.cmd」をダブルクリック,書き込み終了まで待ち,マイコンの電源を切る。
(4)ハイパーターミナルを立ち上げる
(5)マイコンを実行モードで立ち上げる。
コンパイル用windowsスクリプ ト ex2.cmd
rem カレントドライブ・カレントディレクトリへ移動
%~d1
cd %~p1rem コンパイラのパスの設定など
path=%path%;%HOMEDRIVE%\Program Files\h8v2\bin;%HOMEDRIVE%\Progra~1\h8v2\WRITER\maeda
set h8inc=%HOMEDRIVE%\Progra~1\h8v2\include
set h8library=%HOMEDRIVE%\Progra~1\h8v2\lib\c38ha.librem コンパイル&アッセンブル
ch38 -cpu=300ha -include=%h8inc% -OUTCODE=SJIS -CODE=ASMCODE ex2.c
asm38 ex2.src
asm38 start00.srcrem リンク
lnk start00.OBJ ex2.OBJ -subcommand=ex2.sub -LIB=%h8library% -O=ex2 -P=ex2rem Sフォーマットに変換 xxx.motの作成
cnvs ex2.abs転送(省略)
pause
3.3 実行と考察
実行結果は次のようになる。count1が増えていない!!
プログラムex2.cを再確認してもおかしなところはない。
実行結果
左から順にcount1,count2,count31000 2000 3000
1000 2001 3001
1000 2002 3002
1000 2003 3003
1000 2004 3004
1000 2005 3005
変数count1はセクションDに割り当てられている。これは,プログラムソース中の変数宣
言部で初期化している変数はコンパイラがセクションDに自動的割り当てているからである。また,リンカスクリプトex2.subでセクションDをROMに割り当てたのだから,結局,変数count1はROM領域に存在するので,プログラム実行時に変化しないので,この実行結果は当然である。
.mapファイルを見ると
_count1 H'000009B4
_count2 H'000FEF10
となっており,count1はROM領域,count2はRAM領域にあるのがわかる。
参考 メモリマップ
メモリの種類 アドレス 備考 ROM 0x00000-0x01FFFF (128kbyte) 実際にはフラッシュメモリ,書き込みモードでのみ書き込むことが出来る。
電源が切れても,内容は保たれる。
割り込みベクタテーブル,プログラム,定数,変数の初期値の格納場所RAM 0xFEF10-0xFFF0F ( 4kbyte) 電源が切れると内容は消滅する。
変数,スタック(オート変数,戻りアドレス,レジスタ退避)の格納場所
課題2 実際に動作させ,考察しなさい。また調べたことも書きなさい。
count1,count2,count3の様子やLEDの様子。
以下の内容を,考察に含むこと。
(1)ex2.srcファイルを見て,
「count1は初期化(変数定義時に値が代入されている)されているのでセクションDに,
count2は初期化されていないのでセクションBに,
count3はレジスタE3に割り当てられているのがわかる。」
というのは,どのようなところから読み取れるのか,それぞれex2.srcの記述場所を示しながら説明しなさい。
(2)「.mapファイルを見ると
_count1 H'000009B4
_count2 H'000FEF10
となっており,count1はROM領域,count2はRAM領域にあるのがわかる。」
と説明されているが,その根拠をex2.mapの記述場所を示しながら説明しなさい。(3)count1の値が変化しない理由をまとめて説明しなさい。
(sup02.txt)
【3】では変数count1のセクションDがROM領域に割り当てられていたので失敗した。そこで,セクションDをRAM領域に割り当ててみよう。
変数count1のセクションDをRAM領域に変更するには,リンカスクリプトを次のように修正すればよい。
P,CをROM領域(H'100~)から割り当て,D,BをRAM領域(H'FEF10~)に 割り当ててコンパイルリンクしてみよう。
リンカスクリプト ex3.sub
START P,C(100),D,B(0FEF10)
EXIT
コンパイルからマイコンへの書き込みまでのwindowsのスクリプトは次のようになる。
コンパイル用windowsスクリプ ト ex3.cmd
rem カレントドライブ・カレントディレクトリへ移動
%~d1
cd %~p1rem コンパイラのパスの設定など
path=%path%;%HOMEDRIVE%\Program Files\h8v2\bin;%HOMEDRIVE%\Progra~1\h8v2\WRITER\maeda
set h8inc=%HOMEDRIVE%\Progra~1\h8v2\include
set h8library=%HOMEDRIVE%\Progra~1\h8v2\lib\c38ha.librem コンパイル&アッセンブル
ch38 -cpu=300ha -include=%h8inc% -OUTCODE=SJIS -CODE=ASMCODE ex2.c
asm38 ex2.src
asm38 start00.srcrem リンク
lnk start00.OBJ ex2.OBJ -subcommand=ex3.sub -LIB=%h8library% -O=ex2 -P=ex2rem Sフォーマットに変換 xxx.motの作成
cnvs ex2.abs転送(省略)
pause
4.2 実行と考察
ハイパーターミナルにおける実行結果は次のようになる。count1が1000から始まらない!!
ハイパーターミナルにおける実行結果
左から順にcount1,count2,count3-4097 2000 3000
-4096 2001 3001
-4095 2002 3002
-4094 2003 3003
-4093 2004 3004
-4092 2005 3005
-4091 2006 3006
リンカスクリプトex1.subでセクションDをRAMに割り当てたのだから,プログラムを
H8マイコンに書き込んだ時には1000が初期値として書き込まれたはずだが,書き込みモードから実行モードにする際に,電源を切っている。これではせっかく1000が初期値として書き込まれても,電源再投入時にはどんな値になっているのかは不定であり,この実行結果は当然である。
.mapファイルを見ると
_count1 H'000FEF1E
_count2 H'000FEF20
のように,両方の変数がRAM領域にあるのがわかる。
課題3 実際に動作させ,考察しなさい。また調べたことも書きなさい。
count1,count2,count3の様子やLEDの様子。
以下の内容を,考察に含むこと。
count1,count2,count3はどこに割り当てられたのか述べなさい。
根拠を示しながら説明しなさい。
count1の値が予想外な変化をした理由を述べなさい。
(sup03.txt)
5.1 変数count1に関する工夫
期待通りの動作をさせるには,count1の割り付け場所に工夫が必要である。
count1は機械語書き込み時には,ROM領域にあって,動作時にはRAM領域にあればよい。
そのような都合の良い方法を与える仕掛けがある。
コンパイラやアセンブラの段階では,プログラムコードや変数のアドレスはまだ決まっていない。(アドレスを決めてプログラムすることも可能。)アドレスを確定する作業は,リンカの作業であり,具体的な指示はリンカスクリプトに記述する。
リンカスクリプトにはROMオプションという記述がある。これは,あるセクションの全変数ををROM上に置くが,機械語プログラムの命令中に変数を操作
する部分があると,RAM上の別のアドレスに変数があるような機械語プログラムを作るというものである。
このオプションを利用すると,「初期値を持つ変数がまとめられて配置されているいるセクションD」をROM領域に置くが,「プログラム中で読み出したり書き込んだりする変数がRAM上にある」ようにふるまう機械語プログラムを作ることができる。
初期値をもった変数はROM上のセクションD
に置かれる(初期
値も当然ROM上に書き込まれる)が,機械語プログラム中に変数操作の命令があると,それらの変数はRAM上の別のセクションにあるように動作する機械語プログラムとなる。
ROM上のセクションはDであるが,実際に操作するRAM上のセクションには適当な名前(たとえばXとする)を割り当てる。
セクションDには初期値を持つ変数が並んでいるが,その並び順を保ってセクションXが作られる。すなわち,セクションDの先頭から20バイト目にある変数は,セクションXにおいても先頭から20バイト目にあることが保障されている。
P,C,DをROM領域(H'100~)から割り当て,X,BをRAM領域 (H'FEF10~)に割り当てて,ROM領域のセクションDに対応するRAM領域をXとするにはリンカスクリプトを次のように書けばよ い。
リンカスクリプト ex4.sub
ROM (D,X)
START P,C,D(100),X,B(0FEF10)
EXIT
5.2 スタートアップルーチンの修正
リンカスクリプトをこのように変更しても,プログラムはセクションXを対象に動作しているだけで,初期値はセクションDにあるのだから,まだ正しく動作しない。
mainが動き始
める前に,セクションDをセクションXにコピーしなければならない。
すなわち,スタートアップルーチンでセクションDをセクションXにコピーする必要がある。
スタートアップルーチンを作成する時点においては,D,Xはどのくらいのバイト数なのか,どこのアドレスにあるのかはわからない。しかし,名前で書いておけば具体的なバイト数や先頭アドレスはリンカが解決してくれるのはここでも同じである。
キーワードは 「STARTOF」 と 「SIZEOF」 である。セクションDの先頭アドレス,セクションDのサイズ(バイト数),セクションXの先頭アドレスは次の表現で示すことができ,リンカが具体的な値を後で設定してくれる。
_D_Head:
.DATA.L (STARTOF
D) ; Section D Head Address
_X_Head:
.DATA.L (STARTOF
X) ; Section X Head Address
_D_Size:
.DATA.L (SIZEOF
D) ; Section D Size
(STARTOF
D)の部分はリンカがセクションDの先頭アドレスに設定してくれる。
(SIZEOF
D)の部分はリンカがセクションDの大きさ(何バイトあるか)に設定してくれる。
次のスタートアップルーチンを使う。メモリーのブロックムーブが出てきている。
スタートアップルーチン start01.src
.CPU 300HA ;CPUは300Hシリーズアドバンストモード
.IMPORT _main ;mainはこのファイル以外に定義されているのでそれをつかえという意味
.SECTION A,DATA,LOCATE=H'000000
RSTVEC:
.DATA.L START ;アドレス0にスタートアップルーチンのアドレスを書いておく.SECTION P,CODE,ALIGN=2 ;ここがスタートアップルーチンの先頭
START:
MOV.L #H'FFF10,ER7 ;スタックポインタ設定; セクションD(ROM)をSection X(RAM)にコピー
MOV.L @_D_Head,ER0 ;source address to ER0(_D_Head:に書いてある値をER0に)
MOV.L @_X_Head,ER1 ;destination address to ER1
MOV.L @_D_Size,ER2 ;size to be copied to ER2
OR.L ER2,ER2 ;(ER2 or ER2) to ER2(ER0が0かどうかみている)
JMP @LOOP_11
LOOP_1:
MOV.B @ER0+,R3H ;source byte to R3H with ER0++
MOV.B R3H,@ER1 ;R3H to destination
INC.L #1,ER1 ;increment destination address
DEC.L #1,ER2 ;ER2--
LOOP_11:
BNE LOOP_1JSR @_main ; Call main()
EternalLoop:
BRA EternalLoop ;万が一戻ってきても永久ループ.SECTION D, DATA, ALIGN = 2 ;下で参照するために必要(実体はここにはない)
.SECTION X, DATA, ALIGN = 2 ;下で参照するために必要(実体はここにはない).SECTION C, DATA, ALIGN = 2
_D_Head:
.DATA.L (STARTOF D) ; Section D Head Address
_X_Head:
.DATA.L (STARTOF X) ; Section X Head Address
_D_Size:
.DATA.L (SIZEOF D) ; Section D Size.END
コンパイルからマイコンへの書き込みまでのwindowsのスクリプトは次のようになる。
コンパイル用windowsスクリプ ト ex4.cmd
rem カレントドライブ・カレントディレクトリへ移動
%~d1
cd %~p1rem コンパイラのパスの設定など
path=%path%;%HOMEDRIVE%\Program Files\h8v2\bin;%HOMEDRIVE%\Progra~1\h8v2\WRITER\maeda
set h8inc=%HOMEDRIVE%\Progra~1\h8v2\include
set h8library=%HOMEDRIVE%\Progra~1\h8v2\lib\c38ha.librem コンパイル&アッセンブル
ch38 -cpu=300ha -include=%h8inc% -OUTCODE=SJIS -CODE=ASMCODE ex2.c
asm38 ex2.src
asm38 start01.srcrem リンク
lnk start01.OBJ ex2.OBJ -subcommand=ex4.sub -LIB=%h8library% -O=ex2 -P=ex2rem Sフォーマットに変換 xxx.motの作成
cnvs ex2.abs転送(省略)
pause
5.3 実行と考察
ターミナルにおける実行結果は次のようになる。count1
が正しく動作!!
ターミナルにおける実行結果
左から順にcount1,count2,count31000 2000 3000
1001 2001 3001
1002 2002 3002
1003 2003 3003
1004 2004 3004
1005 2005 3005
.mapファイルを見ると
_count1 H'000FEF1E
_count2 H'000FEF20
のように,count1,_count2の2つの変数がRAM領域にあるのがわかる。
初期値がROM上にあることはわからない。
課題4 実際に動作させ,考察しなさい。
「_count1,_count2の2つの変数がRAM領域にあるのがわかる。」の根拠を示しなさい。
また調べたことも書きなさい。
count1が正常に表示されるからくりについて,説明しなさい。
(sup04.txt)
【6】メモリダンププログラムによる検証
メモリの使用状況を表示してみよう。コンパイル時にリンカの作成するmapファイルを見ながら,
何回か作り直して必要な領域を表示するようにしている。
dumpMemoy.c
/**********************************************************
dumpMemory関数でメモリダンプした後
msecwait関数で0.25秒ごとのLEDのON-OFFを行う
**********************************************************/
#include <3048fone.h>
#include "h8_3048fone.h"
void msecwait(int msec)
{
int i,j;
for (i=0;i<msec;i++) {
for (j=0;j<3352;j++); /*3352は実測によって求めた値 20MHz駆動*/
}
}
void dumpMemory(long int address, long int tail)
{
long int i;
unsigned char ch;
address&=0xfffffff0;
tail&=0xfffffff0;
SCI1_printf("address +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF\n");
for (; address<tail; address++) {
if (address%0x10==0) SCI1_printf ("%05lx : ",address);
SCI1_printf("%02x ",*(unsigned char*)address);
if (address%0x10==0xf) {
SCI1_printf(": ");
for (i=-0xf; i<=0; i++) {
ch=*(unsigned char*)(address+i);
SCI1_printf("%c",isprint(ch)?ch:'.');
}
SCI1_printf("\n");
}
}
SCI1_printf("\n");
}
int count1=0x1234;
int count2;
main()
{
int count3=0x3456;
count2=0x2345;
initSCI1(); /*シリアル通信ユニットSCI1の初期化*/
initLed(); /*LED初期化*/
dumpMemory(0L,0x1130L); /*ROM領域*/
dumpMemory(0xfef10L,0xfef30L); /*RAM領域*/
while(1) {
SCI1_printf("%4x %4x %4x\n",count1++,count2++,count3++);
turnOnLed(0); /*LED0のON*/
turnOffLed(1); /*LED1のOFF*/
msecwait(250);
turnOffLed(0); /*LED0のOFF*/
turnOnLed(1); /*LED1のON*/
msecwait(250);
}
}
そのほかのファイルとして,次の3つを使っている
スタートアップルーチン start01.src
リンカスクリプト ex4.sub
コンパイル用スクリプト ex5.cmd (asmのオプションを変更し,.lstを作成するようにした)
実行結果
dumpMemoy.cの実行結果
address +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
00000 : 00 00 01 00 ff ff ff ff ff ff ff ff ff ff ff ff : ................
00010 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
00020 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
00030 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
00040 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
00050 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
00060 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
00070 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
00080 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
00090 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
000a0 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
000b0 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
000c0 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
000d0 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
000e0 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
000f0 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
00100 : 7a 07 00 0f ff 10 01 00 6b 20 00 00 0f 3a 01 00 : z.......k ...:..
00110 : 6b 21 00 00 0f 3e 01 00 6b 22 00 00 0f 42 01 f0 : k!...>..k"...B..
00120 : 64 22 5a 00 01 2e 6c 03 68 93 0b 71 1b 72 46 f6 : d"Z...l.h..q.rF.
00130 : 5e 00 0d c6 40 fe 18 88 38 ba 38 b8 f8 13 38 b9 : ^...@...8.8...8.
00140 : 19 00 0b 50 79 20 03 e8 4d f8 f8 30 38 ba 54 70 : ...Py ..M..08.Tp
00150 : 29 bc 17 51 0d 10 79 60 00 38 47 16 7f bc 72 60 : )..Q..y`.8G...r`
00160 : 7f bc 72 50 7f bc 72 40 7f bc 72 30 79 00 ff fe : ..rP..r@..r0y...
00170 : 54 70 73 69 47 da 7f bc 72 60 29 bd 17 51 0d 10 : TpsiG...r`)..Q..
00180 : 54 70 29 bc 17 51 0d 10 79 60 00 38 47 16 7f bc : Tp)..Q..y`.8G...
00190 : 72 60 7f bc 72 50 7f bc 72 40 7f bc 72 30 79 00 : r`..rP..r@..r0y.
001a0 : ff fe 54 70 73 69 47 0c 29 bd 17 51 7f bc 72 60 : ..TpsiG.)..Q..r`
001b0 : 0d 10 54 70 79 00 ff ff 54 70 5e 00 0e fc 0f 86 : ..Tpy...Tp^.....
001c0 : 0d 1d 19 55 1b 5d 0d d4 40 26 55 84 0d 0d 68 e8 : ...U.]..@&U...h.
001d0 : a8 0d 47 20 0d dd 4d 1c 68 68 a8 08 46 04 1b f6 : ..G ..M.hh..F...
001e0 : 1b d5 68 68 a8 0a 47 04 0b 76 40 02 1b 55 0b 55 : ..hh..G..v@..U.U
001f0 : 1d 45 4d d6 18 88 68 e8 0b 55 0d 50 5a 00 0f 24 : .EM...h..U.PZ..$
00200 : 6d f6 0c 86 a6 0a 46 04 f8 0d 55 f4 28 bc 73 78 : m.....F...U.(.sx
00210 : 47 fa 36 bb 7f bc 72 70 6d 76 54 70 01 00 6d f6 : G.6...rpmvTp..m.
00220 : 0f 86 40 06 68 68 55 d8 0b 76 68 68 46 f6 01 00 : ..@.hhU..vhhF...
00230 : 6d 76 54 70 18 88 38 b2 38 b0 f8 13 38 b1 19 00 : mvTp..8.8...8...
00240 : 0b 50 79 20 03 e8 4d f8 f8 30 38 b2 54 70 29 b4 : .Py ..M..08.Tp).
00250 : 17 51 0d 10 79 60 00 38 47 16 7f b4 72 60 7f b4 : .Q..y`.8G...r`..
00260 : 72 50 7f b4 72 40 7f b4 72 30 79 00 ff fe 54 70 : rP..r@..r0y...Tp
00270 : 73 69 47 da 7f b4 72 60 29 b5 17 51 0d 10 54 70 : siG...r`)..Q..Tp
00280 : 29 b4 17 51 0d 10 79 60 00 38 47 16 7f b4 72 60 : )..Q..y`.8G...r`
00290 : 7f b4 72 50 7f b4 72 40 7f b4 72 30 79 00 ff fe : ..rP..r@..r0y...
002a0 : 54 70 73 69 47 0c 29 b5 17 51 7f b4 72 60 0d 10 : TpsiG.)..Q..r`..
002b0 : 54 70 79 00 ff ff 54 70 5e 00 0e fc 0f 86 0d 1d : Tpy...Tp^.......
002c0 : 19 55 1b 5d 0d d4 40 26 55 84 0d 0d 68 e8 a8 0d : .U.]..@&U...h...
002d0 : 47 20 0d dd 4d 1c 68 68 a8 08 46 04 1b f6 1b d5 : G ..M.hh..F.....
002e0 : 68 68 a8 0a 47 04 0b 76 40 02 1b 55 0b 55 1d 45 : hh..G..v@..U.U.E
002f0 : 4d d6 18 88 68 e8 0b 55 0d 50 5a 00 0f 24 5e 00 : M...h..U.PZ..$^.
00300 : 0e fc 0f 83 1a d5 19 44 0d 4c 19 ee 0d e2 68 38 : .......D.L....h8
00310 : 5a 00 03 b8 79 26 00 2d 46 04 79 0c 00 01 79 26 : Z...y&.-F.y...y&
00320 : 00 61 4d 0a 79 26 00 7a 4e 04 79 16 ff e0 79 26 : .aM.y&.zN.y...y&
00330 : 00 30 46 04 79 04 00 01 79 2e 00 01 46 34 79 26 : .0F.y...y...F4y&
00340 : 00 30 4d 0c 79 26 00 39 4e 06 79 36 00 30 40 10 : .0M.y&.9N.y6.0@.
00350 : 79 26 00 41 4d 0a 79 26 00 46 4e 04 79 16 ff c9 : y&.AM.y&.FN.y...
00360 : 0f d0 10 30 10 30 10 30 10 30 0d 61 17 f1 0a 90 : ...0.0.0.0.a....
00370 : 0f 85 79 24 00 01 46 0a 79 26 00 58 46 04 79 0e : ..y$..F.y&.XF.y.
00380 : 00 01 0d ee 46 24 79 26 00 30 4d 1e 79 26 00 39 : ....F$y&.0M.y&.9
00390 : 4e 18 79 36 00 30 0f d0 7a 01 00 00 00 0a 5e 00 : N.y6.0..z.....^.
003a0 : 0e dc 0d 61 17 f1 0a 90 0f 85 0d 26 0b 56 0d 62 : ...a.......&.V.b
003b0 : 0d 60 17 f0 0a b0 68 08 17 d0 0d 06 58 60 ff 54 : .`....h.....X`.T
003c0 : 79 2c 00 01 46 02 17 b5 0f d0 5a 00 0f 24 01 00 : y,..F.....Z..$..
003d0 : 6d f6 7a 37 00 00 00 10 0f 86 5e 00 02 1c 79 01 : m.z7......^...y.
003e0 : 00 10 0f f0 5e 00 01 ba 0f f0 5e 00 02 fe 7a 17 : ....^.....^...z.
003f0 : 00 00 00 10 01 00 6d 76 54 70 01 00 6d f6 7a 37 : ......mvTp..m.z7
00400 : 00 00 00 10 0f 86 55 38 79 01 00 10 0f f0 5e 00 : ......U8y.....^.
00410 : 02 b8 0f f0 5e 00 02 fe 7a 17 00 00 00 10 01 00 : ....^...z.......
00420 : 6d 76 54 70 6d f6 0c 86 a6 0a 46 04 f8 0d 55 f4 : mvTpm.....F...U.
00430 : 28 b4 73 78 47 fa 36 b3 7f b4 72 70 6d 76 54 70 : (.sxG.6...rpmvTp
00440 : 01 00 6d f6 0f 86 40 06 68 68 55 d8 0b 76 68 68 : ..m...@.hhU..vhh
00450 : 46 f6 01 00 6d 76 54 70 19 11 40 0a 79 08 10 68 : F...mvTp..@.y..h
00460 : 1b 58 46 fc 0b 51 1d 01 45 f2 54 70 19 11 40 0a : .XF..Q..E.Tp..@.
00470 : 79 08 00 04 1b 58 46 fc 0b 51 1d 01 45 f2 54 70 : y....XF..Q..E.Tp
00480 : 0c 80 28 c6 e8 f0 14 08 38 c6 7f c6 70 50 79 00 : ..(.....8...pPy.
00490 : 00 05 55 d8 7f c6 72 50 79 00 00 28 40 ce 6d f6 : ..U...rPy..(@.m.
004a0 : 0c 8e 11 88 11 88 11 88 11 88 e8 0f 55 d2 ee 0f : ............U...
004b0 : 0c e8 55 cc 6d 76 54 70 6d f6 0c 8e 7f c6 70 40 : ..U.mvTpm.....p@
004c0 : 11 88 11 88 11 88 11 88 e8 0f 55 b4 ee 0f 0c e8 : ..........U.....
004d0 : 55 ae 7f c6 72 40 6d 76 54 70 01 00 6d f6 0f 86 : U...r@mvTp..m...
004e0 : 40 04 6c 68 55 d2 68 68 46 f8 01 00 6d 76 54 70 : @.lhU.hhF...mvTp
004f0 : 6d f6 f8 3f 38 c4 28 c6 e8 c0 38 c6 79 00 00 1e : m..?8.(...8.y...
00500 : 5e 00 04 58 fe 03 0c e8 5e 00 04 80 79 00 10 04 : ^..X....^...y...
00510 : 5e 00 04 6c 0c e8 5e 00 04 80 79 00 00 64 5e 00 : ^..l..^...y..d^.
00520 : 04 6c 0c e8 5e 00 04 80 79 00 00 64 5e 00 04 6c : .l..^...y..d^..l
00530 : f8 02 5e 00 04 80 f8 28 5e 00 04 9e f8 0c 5e 00 : ..^....(^.....^.
00540 : 04 9e f8 06 5e 00 04 9e f8 01 5e 00 04 9e 79 00 : ....^.....^...y.
00550 : 06 68 5e 00 04 6c 6d 76 54 70 01 00 6d f6 0d 0e : .h^..lmvTp..m...
00560 : 0d 86 f6 40 50 66 08 8e 8e 80 0c e8 5e 00 04 9e : ...@Pf......^...
00570 : 01 00 6d 76 54 70 f8 01 5e 00 04 9e 79 00 06 68 : ..mvTp..^...y..h
00580 : 5a 00 04 6c 6d f5 0c 8d 7a 01 00 0f ef 12 01 00 : Z..lm...z.......
00590 : 69 10 68 8d 01 00 69 10 0b 70 01 00 69 90 01 00 : i.h...i..p..i...
005a0 : 69 11 18 88 68 98 6d 75 54 70 01 00 6d f6 0f 86 : i...h.muTp..m...
005b0 : 40 04 6c 68 55 ce 68 68 46 f8 01 00 6d 76 54 70 : @.lhU.hhF...mvTp
005c0 : 5e 00 0e fc 7a 37 00 00 00 44 0d 0d 01 00 6f f1 : ^...z7...D....o.
005d0 : 00 2e 01 00 6f 76 00 5c 18 55 0c 54 18 88 6e f8 : ....ov.\.U.T..n.
005e0 : 00 3a f8 20 6e f8 00 32 f8 0a 6e f8 00 3b f8 20 : .:. n..2..n..;.
005f0 : 6e f8 00 39 0f f3 0b 93 18 dd 6e fd 00 33 1a 80 : n..9......n..3..
00600 : 0f 82 6b 20 00 00 0f 46 1d 0d 46 1a 7a 00 00 00 : ..k ...F..F.z...
00610 : 04 24 01 00 6f f0 00 3c 7a 00 00 00 04 40 01 00 : .$..o..<z....@..
00620 : 6f f0 00 34 40 5a 6b 20 00 00 0f 48 1d 0d 46 1a : o..4@Zk ...H..F.
00630 : 7a 00 00 00 02 00 01 00 6f f0 00 3c 7a 00 00 00 : z.......o..<z...
00640 : 02 1c 01 00 6f f0 00 34 40 36 6b 20 00 00 0f 4a : ....o..4@6k ...J
00650 : 1d 0d 46 14 7a 00 00 00 04 b8 01 00 6f f0 00 3c : ..F.z.......o..<
00660 : 7a 00 00 00 04 da 40 12 7a 00 00 00 05 84 01 00 : z.....@.z.......
00670 : 6f f0 00 3c 7a 00 00 00 05 aa 01 00 6f f0 00 34 : o..<z.......o..4
00680 : 7a 00 00 00 00 25 0a f0 01 00 6f f0 00 2a 5a 00 : z....%....o..*Z.
00690 : 0a 9a 01 00 6f 70 00 2e 68 0c 0c 44 46 44 ac 25 : ....op..h..DFD.%
006a0 : 46 32 f4 01 18 55 f8 20 6e f8 00 32 18 88 6e f8 : F2...U. n..2..n.
006b0 : 00 3b 6e f8 00 3a 01 00 6f 73 00 2a 0f b0 1b 73 : .;n..:..os.*...s
006c0 : 18 99 68 89 18 dd 6e fd 00 33 f8 2b 6e f8 00 39 : ..h...n..3.+n..9
006d0 : 5a 00 0a 8c 0c c8 01 00 6f 71 00 3c 5d 10 5a 00 : Z.......oq.<].Z.
006e0 : 0a 8c ac 6c 46 06 70 14 5a 00 08 ae ac 30 4d 2c : ...lF.p.Z....0M,
006f0 : ac 39 4e 28 0c 55 46 0e ac 30 46 0a f8 30 6e f8 : .9N(.UF..0F..0n.
00700 : 00 32 5a 00 08 ae f8 0a 50 50 08 c8 88 d0 0c 85 : .2Z.....PP......
00710 : a8 20 58 30 01 98 f5 20 5a 00 08 ae ac 2d 46 0a : . X0... Z....-F.
00720 : f8 01 6e f8 00 3a 5a 00 08 ae ac 64 46 0c 70 24 : ..n..:Z....dF.p$
00730 : f8 0a 6e f8 00 3b 5a 00 08 ae ac 75 46 0a f8 0a : ..n..;Z....uF...
00740 : 6e f8 00 3b 5a 00 08 ae ac 78 46 0a f8 10 6e f8 : n..;Z....xF...n.
00750 : 00 3b 5a 00 08 ae ac 58 46 0e f8 10 6e f8 00 33 : .;Z....XF...n..3
00760 : 6e f8 00 3b 5a 00 08 ae ac 6f 46 0a f8 08 6e f8 : n..;Z....oF...n.
00770 : 00 3b 5a 00 08 ae ac 62 46 0a f8 02 6e f8 00 3b : .;Z....bF...n..;
00780 : 5a 00 08 ae ac 70 46 18 f8 10 6e f8 00 33 6e f8 : Z....pF...n..3n.
00790 : 00 3b f5 08 f8 30 6e f8 00 32 70 14 5a 00 08 ae : .;...0n..2p.Z...
007a0 : ac 63 46 3c 0f e0 0b f0 01 00 6f f0 00 26 73 08 : .cF<......o..&s.
007b0 : 47 04 0b 70 40 06 01 00 6f 70 00 26 0f 86 1b f0 : G..p@...op.&....
007c0 : 0f 84 73 08 47 06 0f c1 1b 71 40 02 0f c1 6e 18 : ..s.G....q@...n.
007d0 : 00 01 01 00 6f 71 00 3c 5d 10 18 44 5a 00 08 ae : ....oq.<]..DZ...
007e0 : ac 73 58 60 00 bc 0c 55 58 70 00 7e 18 dd 0f e0 : .sX`...UXp.~....
007f0 : 0b 90 01 00 6f f0 00 26 73 08 47 04 0b 70 40 06 : ....o..&s.G..p@.
00800 : 01 00 6f 70 00 26 0f 86 1b 90 0f 84 73 08 47 04 : ..op.&......s.G.
00810 : 1b 70 40 02 0f c0 01 00 69 03 40 02 0a 0d 0c d8 : .p@.....i.@.....
00820 : 17 50 17 70 0a b0 68 09 46 f2 6e 78 00 3a 46 14 : .P.p..h.F.nx.:F.
00830 : 0c dc 40 0c f8 20 01 00 6f 71 00 3c 5d 10 0a 0c : ..@.. ..oq.<]...
00840 : 1c 5c 45 f0 0f b0 01 00 6f 71 00 34 5d 10 6e 78 : .\E.....oq.4].nx
00850 : 00 3a 47 58 0c dc 40 0c f8 20 01 00 6f 71 00 3c : .:GX..@.. ..oq.<
00860 : 5d 10 0a 0c 1c 5c 45 f0 40 42 0f e0 0b 90 01 00 : ]....\E.@B......
00870 : 6f f0 00 26 73 08 47 04 0b 70 40 06 01 00 6f 70 : o..&s.G..p@...op
00880 : 00 26 0f 86 1b 90 0f 84 73 08 47 06 0f c1 1b 71 : .&......s.G....q
00890 : 40 02 0f c1 01 00 69 10 01 00 6f 71 00 34 5d 10 : @.....i...oq.4].
008a0 : 40 0a 0c c8 01 00 6f 71 00 3c 5d 10 18 44 6e 78 : @.....oq.<]..Dnx
008b0 : 00 3b 58 70 01 d6 e4 06 0c 48 47 12 a8 02 47 3e : .;Xp.....HG...G>
008c0 : a8 04 47 6a a8 06 58 70 00 98 5a 00 09 ce 0f e4 : ..Gj..Xp..Z.....
008d0 : 0b f4 73 0c 47 06 0f c0 0b 70 40 02 0f c0 0f 86 : ..s.G....p@.....
008e0 : 1b f0 01 00 6f f0 00 26 73 08 47 04 1b 70 40 06 : ....o..&s.G..p@.
008f0 : 01 00 6f 70 00 26 69 00 17 70 5a 00 09 cc 0f e0 : ..op.&i..pZ.....
00900 : 0b 90 01 00 6f f0 00 26 73 08 47 04 0b 70 40 06 : ....o..&s.G..p@.
00910 : 01 00 6f 70 00 26 0f 86 1b 90 0f 84 73 08 47 04 : ..op.&......s.G.
00920 : 1b 70 40 02 0f c0 01 00 69 02 5a 00 09 ce 0f e4 : .p@.....i.Z.....
00930 : 0b f4 73 0c 47 06 0f c0 0b 70 40 02 0f c0 0f 86 : ..s.G....p@.....
00940 : 1b f0 0f 82 73 08 47 04 1b 70 40 02 0f a0 69 00 : ....s.G..p@...i.
00950 : 17 f0 0f 82 4c 78 17 b0 0f 82 f8 2d 6e f8 00 39 : ....Lx.....-n..9
00960 : 40 6c 0f e4 0b 94 73 0c 47 06 0f c0 0b 70 40 02 : @l....s.G....p@.
00970 : 0f c0 0f 86 1b 90 0f 82 73 08 47 04 1b 70 40 02 : ........s.G..p@.
00980 : 0f a0 01 00 69 00 0f 82 4c 44 17 b0 0f 82 f8 2d : ....i...LD.....-
00990 : 6e f8 00 39 40 38 0f b0 1b 73 1a c4 6e 7c 00 3b : n..9@8...s..n|.;
009a0 : 01 00 69 f0 0f a0 0f c1 5e 00 0e a0 1a 80 6e 78 : ..i.....^.....nx
009b0 : 00 33 0a 81 78 10 6a 29 00 00 0f 4e 01 00 69 70 : .3..x.j)...N..ip
009c0 : 68 89 0a 0d 0f a0 0f c1 5e 00 0e a0 0f 82 0f a0 : h.......^.......
009d0 : 46 c4 0c dd 46 0a 0f b0 1b 73 f9 30 68 89 0a 0d : F...F....s.0h...
009e0 : 6e 78 00 32 a8 20 46 54 6e 78 00 39 a8 2d 46 0a : nx.2. FTnx.9.-F.
009f0 : 0f b0 1b 73 f9 2d 68 89 0a 0d 6e 78 00 3a 46 14 : ...s.-h...nx.:F.
00a00 : 0c dc 40 0c f8 20 01 00 6f 71 00 3c 5d 10 0a 0c : ..@.. ..oq.<]...
00a10 : 1c 5c 45 f0 0b 73 0f b0 01 00 6f 71 00 34 5d 10 : .\E..s....oq.4].
00a20 : 6e 78 00 3a 47 64 0c dc 40 0c f8 20 01 00 6f 71 : nx.:Gd..@.. ..oq
00a30 : 00 3c 5d 10 0a 0c 1c 5c 45 f0 40 4e 0c 58 17 50 : .<]....\E.@N.X.P
00a40 : 1b 50 0d 0d f9 30 40 08 0f b0 1b 73 68 89 0a 0d : .P...0@....sh...
00a50 : 0c d8 17 50 1d d0 4d f0 6e 78 00 39 a8 2d 47 0e : ...P..M.nx.9.-G.
00a60 : 1c 5d 44 0a 0f b0 1b 73 f9 30 68 89 40 10 6e 78 : .]D....s.0h.@.nx
00a70 : 00 39 a8 2d 46 08 0f b0 1b 73 f9 2d 68 89 0b 73 : .9.-F....s.-h..s
00a80 : 0f b0 01 00 6f 71 00 34 5d 10 18 44 01 00 6f 70 : ....oq.4]..D..op
00a90 : 00 2e 0b 70 01 00 6f f0 00 2e 01 00 6f 70 00 2e : ...p..o.....op..
00aa0 : 68 09 58 60 fb ec 7a 17 00 00 00 44 5a 00 0f 24 : h.X`..z....DZ..$
00ab0 : 01 00 6d f6 7a 06 00 00 00 04 7a 00 00 00 00 08 : ..m.z.....z.....
00ac0 : 0a f0 0a e0 73 08 47 0e 7a 00 00 00 00 08 0a f0 : ....s.G.z.......
00ad0 : 0a e0 0b 70 40 0a 7a 00 00 00 00 08 0a f0 0a e0 : ...p@.z.........
00ae0 : 01 00 6d f0 01 00 6f 71 00 0c 6b 20 00 00 0f 46 : ..m...oq..k ...F
00af0 : 5e 00 05 c0 0b 97 01 00 6d 76 54 70 01 00 6d f6 : ^.......mvTp..m.
00b00 : 7a 06 00 00 00 04 7a 00 00 00 00 08 0a f0 0a e0 : z.....z.........
00b10 : 73 08 47 0e 7a 00 00 00 00 08 0a f0 0a e0 0b 70 : s.G.z..........p
00b20 : 40 0a 7a 00 00 00 00 08 0a f0 0a e0 01 00 6d f0 : @.z...........m.
00b30 : 01 00 6f 71 00 0c 6b 20 00 00 0f 48 5e 00 05 c0 : ..oq..k ...H^...
00b40 : 0b 97 01 00 6d 76 54 70 01 00 6d f6 7a 06 00 00 : ....mvTp..m.z...
00b50 : 00 04 7a 00 00 00 00 08 0a f0 0a e0 73 08 47 0e : ..z.........s.G.
00b60 : 7a 00 00 00 00 08 0a f0 0a e0 0b 70 40 0a 7a 00 : z..........p@.z.
00b70 : 00 00 00 08 0a f0 0a e0 01 00 6d f0 01 00 6f 71 : ..........m...oq
00b80 : 00 0c 6b 20 00 00 0f 4a 5e 00 05 c0 0b 97 01 00 : ..k ...J^.......
00b90 : 6d 76 54 70 01 00 6d f6 0f 81 7a 06 00 00 00 04 : mvTp..m...z.....
00ba0 : 7a 00 00 00 00 08 0a f0 0a e0 73 08 47 0e 7a 00 : z.........s.G.z.
00bb0 : 00 00 00 08 0a f0 0a e0 0b 70 40 0a 7a 00 00 00 : .........p@.z...
00bc0 : 00 08 0a f0 0a e0 01 00 6b a1 00 0f ef 12 01 00 : ........k.......
00bd0 : 6d f0 01 00 6f 71 00 0c 6b 20 00 00 0f 4c 5e 00 : m...oq..k ...L^.
00be0 : 05 c0 0b 97 01 00 6d 76 54 70 f8 0f 38 c8 54 70 : ......mvTp..8.Tp
00bf0 : 01 00 6d f6 0d 06 17 f6 78 60 6a 2e 00 00 0f 6f : ..m.....x`j....o
00c00 : 28 ca 14 e8 38 ca 01 00 6d 76 54 70 01 00 6d f6 : (...8...mvTp..m.
00c10 : 0d 06 17 f6 78 60 6a 2e 00 00 0f 73 28 ca 16 e8 : ....x`j....s(...
00c20 : 38 ca 01 00 6d 76 54 70 18 88 38 c5 f8 f0 38 da : 8...mvTp..8...8.
00c30 : 54 70 01 00 6d f6 0d 06 17 f6 28 c7 78 60 6a 2e : Tp..m.....(.x`j.
00c40 : 00 00 0f 77 16 e8 47 04 19 66 40 04 79 06 00 01 : ...w..G..f@.y...
00c50 : 0d 60 01 00 6d 76 54 70 18 88 38 c1 f8 ff 38 d8 : .`..mvTp..8...8.
00c60 : 54 70 01 00 6d f6 0d 06 17 f6 28 c3 78 60 6a 2e : Tp..m.....(.x`j.
00c70 : 00 00 0f 7b 16 e8 47 04 19 66 40 04 79 06 00 01 : ...{..G..f@.y...
00c80 : 0d 60 01 00 6d 76 54 70 01 00 6d f6 0d 06 79 0e : .`..mvTp..m...y.
00c90 : 00 19 52 e6 0b 96 11 b6 11 b6 11 b6 28 6e e8 9f : ..R.........(n..
00ca0 : c8 20 38 6e 28 6e e8 e7 38 6e 28 6e e8 f8 c8 03 : . 8n(n..8n(n....
00cb0 : 38 6e 1b 56 6b 86 ff 74 7f 70 70 00 7f 70 72 20 : 8n.Vk..t.pp..pr
00cc0 : 7f 70 72 10 01 00 6d 76 54 70 19 11 40 0a 79 08 : .pr...mvTp..@.y.
00cd0 : 0d 18 1b 58 46 fc 0b 51 1d 01 4d f2 54 70 5e 00 : ...XF..Q..M.Tp^.
00ce0 : 0e fc 0f 86 0f 94 7a 66 ff ff ff f0 0f c0 7a 60 : ......zf......z`
00cf0 : ff ff ff f0 0f 84 7a 00 00 00 0f 83 01 00 6d f0 : ......z.......m.
00d00 : 5e 00 0a fc 0b 97 5a 00 0d ac 0f e0 7a 01 00 00 : ^.....Z.....z...
00d10 : 00 10 5e 00 0e 7a 0f 95 46 16 01 00 6d f6 7a 00 : ..^..z..F...m.z.
00d20 : 00 00 0f cf 01 00 6d f0 5e 00 0a fc 0b 97 0b 97 : ......m.^.......
00d30 : 68 68 17 50 6d f0 7a 00 00 00 0f d8 01 00 6d f0 : hh.Pm.z.......m.
00d40 : 5e 00 0a fc 0b 97 0b 87 7a 25 00 00 00 0f 46 5a : ^.......z%....FZ
00d50 : 7a 00 00 00 0f de 01 00 6d f0 5e 00 0a fc 0b 97 : z.......m.^.....
00d60 : 7a 05 ff ff ff f1 0f e3 0a d3 68 3b 17 53 0d 30 : z.........h;.S.0
00d70 : 5e 00 0e 5e 0d 00 47 04 0d 32 40 04 79 02 00 2e : ^..^..G..2@.y...
00d80 : 6d f2 7a 00 00 00 0f e1 01 00 6d f0 5e 00 0a fc : m.z.......m.^...
00d90 : 0b 97 0b 87 0b 75 0f d5 4f cc 7a 00 00 00 0f e4 : .....u..O.z.....
00da0 : 01 00 6d f0 5e 00 0a fc 0b 97 0b 76 1f c6 58 d0 : ..m.^......v..X.
00db0 : ff 58 7a 00 00 00 0f e4 01 00 6d f0 5e 00 0a fc : .Xz.......m.^...
00dc0 : 0b 97 5a 00 0f 24 19 33 79 0c 00 01 79 04 00 fa : ..Z..$.3y...y...
00dd0 : 7a 05 00 0f ef 10 7a 06 00 0f ef 16 79 0b 34 56 : z.....z.....y.4V
00de0 : 79 00 23 45 69 e0 5e 00 01 36 5e 00 0b ea 7a 01 : y.#Ei.^..6^...z.
00df0 : 00 00 11 30 1a 80 5e 00 0c de 7a 01 00 0f ef 30 : ...0..^...z....0
00e00 : 7a 00 00 0f ef 10 5e 00 0c de 0d b0 0b 5b 6d f0 : z.....^......[m.
00e10 : 69 60 0b 50 69 e0 1b 50 6d f0 69 50 0b 50 69 d0 : i`.Pi..Pm.iP.Pi.
00e20 : 1b 50 6d f0 7a 00 00 00 0f e6 01 00 6d f0 5e 00 : .Pm.z.......m.^.
00e30 : 0a fc 7a 17 00 00 00 0a 0d 30 5e 00 0b f0 0d c0 : ..z......0^.....
00e40 : 5e 00 0c 0c 0d 40 5e 00 0c ca 0d 30 5e 00 0c 0c : ^....@^....0^...
00e50 : 0d c0 5e 00 0b f0 0d 40 5e 00 0c ca 40 ac 01 00 : ..^....@^...@...
00e60 : 6d f6 0d 06 17 56 17 76 78 60 6a 28 00 00 0f f4 : m....V.vx`j(....
00e70 : e8 1f 17 50 01 00 6d 76 54 70 6d f2 0d 82 0c 2a : ...P..mvTpm....*
00e80 : 4a 02 17 b0 0d 99 4a 04 d2 80 17 b1 5e 00 0e a0 : J.....J.....^...
00e90 : 0c 22 4a 02 17 b0 0c aa 4a 02 17 b1 6d 72 54 70 : ."J.....J...mrTp
00ea0 : 01 00 6d f2 0d 99 46 10 0d 82 17 72 53 12 0d a8 : ..m...F....rS...
00eb0 : 53 10 0d 81 0d 28 40 1e 0f 92 0d 81 17 71 79 08 : S....(@......qy.
00ec0 : 00 10 12 10 12 31 1a a1 44 02 0a a1 1b 58 46 f2 : .....1..D....XF.
00ed0 : 12 10 17 10 17 70 01 00 6d 72 54 70 01 00 6d f3 : .....p..mrTp..m.
00ee0 : 01 00 6d f2 0d 82 52 12 0d 93 52 03 52 10 09 28 : ..m...R...R.R..(
00ef0 : 09 38 01 00 6d 72 01 00 6d 73 54 70 01 00 6d f5 : .8..mr..msTp..m.
00f00 : 01 00 6d f4 01 00 6d f3 01 00 6d f2 01 00 6f 72 : ..m...m...m...or
00f10 : 00 10 01 00 6d f2 01 00 6f f6 00 14 01 00 6f 72 : ....m...o.....or
00f20 : 00 04 54 70 01 00 6d 72 01 00 6d 73 01 00 6d 74 : ..Tp..mr..ms..mt
00f30 : 01 00 6d 75 01 00 6d 76 54 70 00 00 10 f4 00 0f : ..mu..mvTp......
00f40 : ef 10 00 00 00 02 00 00 00 01 00 02 00 03 30 31 : ..............01
00f50 : 32 33 34 35 36 37 38 39 61 62 63 64 65 66 30 31 : 23456789abcdef01
00f60 : 32 33 34 35 36 37 38 39 41 42 43 44 45 46 00 01 : 23456789ABCDEF..
00f70 : 02 04 08 fe fd fb f7 10 20 40 80 01 02 04 08 10 : ........ @......
00f80 : 20 40 80 61 64 64 72 65 73 73 20 2b 30 20 2b 31 : @.address +0 +1
00f90 : 20 2b 32 20 2b 33 20 2b 34 20 2b 35 20 2b 36 20 : +2 +3 +4 +5 +6
00fa0 : 2b 37 20 2b 38 20 2b 39 20 2b 41 20 2b 42 20 2b : +7 +8 +9 +A +B +
00fb0 : 43 20 2b 44 20 2b 45 20 2b 46 20 20 20 30 31 32 : C +D +E +F 012
00fc0 : 33 34 35 36 37 38 39 41 42 43 44 45 46 0a 00 25 : 3456789ABCDEF..%
00fd0 : 30 35 6c 78 20 3a 20 00 25 30 32 78 20 00 3a 20 : 05lx : .%02x .:
00fe0 : 00 25 63 00 0a 00 25 34 78 20 25 34 78 20 25 34 : .%c...%4x %4x %4
00ff0 : 78 0a 00 ff 20 20 20 20 20 20 20 20 20 60 60 60 : x... ```
01000 : 60 60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 : ``
01010 : 20 20 20 20 48 10 10 10 10 10 10 10 10 10 10 10 : H...........
01020 : 10 10 10 10 84 84 84 84 84 84 84 84 84 84 10 10 : ................
01030 : 10 10 10 10 10 81 81 81 81 81 81 01 01 01 01 01 : ................
01040 : 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 10 : ................
01050 : 10 10 10 10 10 82 82 82 82 82 82 02 02 02 02 02 : ................
01060 : 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 10 : ................
01070 : 10 10 10 20 00 00 00 00 00 00 00 00 00 00 00 00 : ... ............
01080 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
01090 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
010a0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
010b0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
010c0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
010d0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
010e0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
010f0 : 00 00 00 00 12 34 ff ff ff ff ff ff ff ff ff ff : .....4..........
01100 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
01110 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
01120 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
address +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
fef10 : 12 34 fb ff ff ff 23 45 3f ff ff ff ff ef ff ff : .4....#E?.......
fef20 : ff ff ff e7 ff ff fd ff ff ff ef ff bf fe f9 7f : ................
1234 2345 3456
1235 2346 3457
1236 2347 3458
1237 2348 3459
1238 2349 345a
スタートアップルーチンへのアドレス
(vector 0 =00000100)
start01.srcの先頭部の記述
.SECTION A,DATA,LOCATE=H'000000
RSTVEC:
.DATA.L START
.SECTION P,CODE,ALIGN=2
START:
MOV.L #H'FFF10,ER7 ;スタックポインタ設定
スタートアップルーチンの先頭
7a 07 00 0f ff 10 は「mov.l H'fff10, ER7」
5e000dc6 jsr _main (5eはjsr命令)
アドレスdc6 「19 33:SUB.W R3,R3」
ここがmain()のはじまり
.mapファイル情 報
_main H'00000DC6
0f39までがプログラムコード
.mapファイル情報
* TOTAL ADDRESS * H'00000100 - H'00000F39
0f3aよりセクションC
.mapファイル情 報
* TOTAL ADDRESS * H'00000F3A - H'000010F3
セクションC内にprintfの書式文字列が見えている
10f3までセクションC(.mapファイル情報)
10f4からセクションD
.mapファイル情報
* TOTAL ADDRESS * H'000010F4 - H'000010F5
10f4の1234が変数 count1の初期値(ROM領域)
fef10が変数count1 すで にstartupルーチンでコピーされている
fef16が変数count2 mainの最初で値が代入されている
.mapファイル情 報
_count1 H'000FEF10
_count2 H'000FEF16
課題5 dumpMemory.cを次のように変更し,実際に動作させ, main()において int count3=0x3456; int count3=0x3456; |
【7】実際のスタートアップルーチンについて
【5】で示したスタートアップルーチンは,初期化された静的変数を正しく動作させるためのものであった。
ANSI-Cによれば,初期化されていない静的変数は0が代入されていなければならない。
またCPUの割り込み許可や禁止操作はCプログラムから頻繁に行いたいが,Cでは記述できず,アセンブリプログラムで記述しなくてはならない。
そのため,
(1)静的変数領域であるセクションBに値0を埋め込む作業
(2)割り込み許可・禁止関数
を書き加えたものが実用のスタートアップルーチンとなっている。
【8】コンパイルから,実行までの流れ
これまで,コンパイルして,マイコンに実行プログラムを書き込む作業は,便利なコマンドに作成した.cファイルをドロップするだけで行なっていた。この作業の中身は見えないようになっていたが,もう少し詳しく解説しよう。
【6】のプログラムは各レジスタの内容を表示させる必要がなく,モニタプログラムは使わずに動作させるつもりでCプログラムをC言語で作成した。この場合について,コンパイル作業を細かく見ると三つの作業を行なっている。
(1)コンパイル
コンパイラによって機械語に変換する。しかし,mainを含む各関数の先頭アドレス,ジャンプ命令などのジャンプ先アドレス,変数がメモ
リ上でどこに割り
振られるか(変数のアドレス)が相対的に決まっているだけで,具体的なアドレスが定まっていないリロケータブルオブジェクト(再配置可能)と呼ばれる機械語プログラムになる。
複数のソースファイルから構成される場合は,それぞれのソースファイルに対応したリロケータブルオブジェクトが生成される。
ソースファイルがアセンブリ言語で書かれている場合は,コンパイラではなく,アセンブラがリロケータブルオブジェクトを生成する。例えば
アセンブリ言語で書かれたスタートアップルーチンは,アセンブラによってリロケータブルオブジェクトになっている。
(2)リンク
リンカは,複数のリロケータブルオブジェクトをつなぎあわせ,相対的に定まっているアドレスを実アドレスとして確定し,実行形式オブジェ
クトを生成する。
リロケータブルオブジェクトの並び順や,アドレスの配置はリンカ起動時のオプションあるいはリンカスクリプトによって指定される。実アドレスが決まるの
で,メモリマップを作らせることができる。
複数のリロケータブルオブジェクトは各々に複数のセグメント(P,C,Dなど)を含んでおり,指定されたセグメント順に実アドレスが決定
される。
なお,アセンブリ言語で書かれたソースファイルの中には,実アドレスの決定をリンカ任せにせず,実アドレスを直接指定することがある。例
えばスタートアップルーチンは実行ルーチンの先頭アドレスをメモリの0番地に書かなければならないので,実アドレスを直接指定している。
モニタプログラム上で,テストルーチンの動作を検証するときも,実アドレス指定で記述することが多い。
(3)コンバート
実行可能形式オブジェクト(機械語プログラム)をマイクロコンピュータのメモリに書き込むには,そのままでは転送できない。そこで,テキ
ストのみでできた
転送形式ファイル(モトローラ形式)に変換する必要がある。コンバータがこの作業を行う。転送形式のファイルが生成されたら,ライタアプ
リでシリアル通信
を使って,マイクロコンピュータに書き込む。(マイクロコンピュータは起動時に,プログラムを受け取るブートモード(ライトモード)ある
いはすでに書きこ
まれたプログラムを実行するランモードのどちらかで起動する)
注 モニタプログラムによるテストルーチンの動作検証
モニタプログラムによるテストルーチン
の動作検証をしたが,これは最初にモニタプログラム(転送形式で大きなプログラム)をブートモードで転送し,モニタプログラムを動作させ
ている状態で,テ
ストルーチンプログラムをモニタプログラムのコマンドで読み込ませたり動作させたりして検証していている。テストルーチンプログラムは
RAM領域だけで動
作できるように実アドレス指定で作っている。(リンカに実アドレス確定を任せるように作ることもできるが,検証しにくい)
課題6 dumpMemory.cを次のようにして動作させ,メモリ
の内容について考察しなさい。 .subファイルはリンカにメモリ割り付けを示しているが,
を
このようにして,実行し,どのようになったかを示しなさい。
また調べたことも書きなさい。
その中身
ROM (D,X)
START P,C,D(100),X,B(0FEF10)
EXIT
ROM (D,X)
START P,C,D(140),X,B(0FEF10)
EXIT
のように書き換えなさい。
実行結果でどこが変わったのか,どうしてそのように変化したのかを考察しなさい。
(sup06.txt)