AKI-H8用スタートアップルーチンの役割学習


Copyright(C) 30Sep2008
coskx 

【1】はじめに

 問題の設定
 プログラム中で変数はRAMとROMのどちらにおかれるのか。
 もし,RAMに置かれたら,プログラム中から変数の値の変更は可能だけれど,電源を切ると,保存内容
 が失われるため,初期値を持った変数は,初期値を保つことができない。
 もし,ROMにおかれたら,電源が切れても,値を保つことができるので,初期値を保つことができるが,
 プログラム中から変数の値を変更することはできない。

 H8/3048のCプログラミングの時のスタートアップルーチンの役割を,未完成のスタートアップルーチンから学ぶ。
 同時に,コンパイラ,リンカの役割も学ぶ。
 作業は評価版コンパイラVer2が設定されたPC上で行なう。
 すでにC言語によるプログラム,アセンブリ言語による簡単なプログラムを習得してから読むこと

参考 H8/3048のメモリマップ

メモリの
種類
アドレス 備考
ROM 0x00000-0x1FFFF
(128kbyte)
実際にはフラッシュメモリ,書き込みモードでのみ書き込むことが出来る。
電源が切れても,内容は保たれる。プログラム中で値を変更できない。

割り込みベクタテーブル,プログラム,定数,変数の初期値の格納場所
RAM 0xFEF10-0xFFF0F
( 4kbyte)
電源が切れると内容は消滅する。プログラム中で値を変更できる。

変数,スタック(オート変数,戻りアドレス,レジスタ退避)の格納場所

ここに書かれた以外のアドレスには,メモリは実装されていない。

 

【2】LEDの点滅プログラムと原始的スタートアップルーチン
 次のLEDの点滅Cプログラムでは関数呼び出し(サブルーチン呼び出し)を用いている。
このため,Cプログラムが実行される前にスタックポインタの設定が必要である。
スタックはRAMの最後尾におかれ,メモリの後ろから若いアドレスに向けて使用されるので,
通常スタックポインタにはRAMの最後尾のアドレスが設定される。

ex1.c (LED点滅プログラム)

/*  msecwait関数で1秒ごとのLEDのON-OFFを行う  */
#include <3048f.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);
    }
}

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
というのは,プログラムを機械語に変換した際,機械語プログラムは偶数番地から始まりなさいという意味である。

リンカはスタートアップルーチンとCプログラムを結合し,アドレス配置を決定する。
コンパイルのみ行って,ex1.srcファイルをみると,アドレス未決定のセクションは「P(プログラムコード)」のみなので,セクションPをアドレスH'100から配置するようにリンカスクリプトを書く。

リンカスクリプト ex1.sub

START P(100)
EXIT

コンパイルからマイコンへの書き込みまでをwindowsのスクリプトとして作っておく。
マイコンを書き込みモードで起動しておいて,この「ex1.cmd」をダブルクリックするだけで書き込みまで終了する。

具体的手順
(1)シリアルケーブルでマイコンをPCとつなげる
(2)マイコンを書き込みモードで立ち上げる。
(3)「ex1.cmd」をダブルクリック,書き込み終了まで待ち,マイコンの電源を切る。
(4)マイコンを実行モードで立ち上げる。

コンパイル用windowsスクリプト ex1.cmd

rem カレントドライブ・カレントディレクトリへ移動
%~d1
cd %~p1

rem コンパイラのパスの設定など
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.src

rem リンク
lnk start00.OBJ ex1.OBJ -subcommand=ex1.sub -LIB=%h8library% -O=ex1 -P=ex1

rem Sフォーマットに変換 〜.motの作成
cnvs ex1.abs

n-h8w.exe ex1.mot
pause

ここで取り上げたコンパイル用windowsスクリプトを動作させると次のようなファイルが生成される。
コンパイラCH38により  ex1.cから作成されるファイル
  ex1.src      アセンブリ言語ソース(テキストエディタで読める)
            (Cソースファイルがどのようにアセンブリ言語に変換されたかわかる)
  ex1.lst      リスト(テキストエディタで読める)

アセンブラasm38により ex1.src start00.srcから作成されるファイル
  ex1.OBJ      機械語中間ファイル
  start00.OBJ    機械語中間ファイル

リンカlnkにより    start00.OBJ ex1.OBJから作成されるファイル
  ex1.ABS      機械語ファイル
  ex1.MAP      マップファイル(テキストエディタで読める)
           (関数のアドレスや静的変数のアドレスが判る)

変換ツールcnvsにより  ex1.ABSから作成されるファイル
  ex1.MOT      転送形式機械語ファイル(テキストエディタで読める)

転送プログラムでex1.motがマイクロコンピュータに転送されたときに,マイクロコンピュータ内のメモリは次のようになっている。

メモリ 内容 説明
0(Hex) 100(Hex) マイクロコンピュータは,電源起動時に,0番地に書いてある値を起動先頭番地として
プログラムカウンタ(PC)に書き込んで動作を始める
100(Hex) セクションPの内容

セクションPはスタートアップルーチンファイル内に記述されている。
またCプログラムファイルの実行部はコンパイラによってセクションPに設定されるため,
セ クションPはスタートアップルーチンとCのmain部によってできている。リンカへの指示順において,スタートアップルーチンの方が先なので,セクション Pではスタートアップルーチンが先で,そのあとにCのmainが置かれる。よって100番地からはスタートアップルーチンが置かれている。

スタートアップルーチンの終わりのところで,Cのmainへジャンプしている。

 

課題1 実際に動作させ,考察しなさい。また調べたことも書きなさい。
(sup01.txt)
 ファイルダウンロード 


【3】LEDの点滅+コンソール表示プログラムと原始的スタートアップルーチン

 ハードウェア操作部分を関数に隠したプログラム(ここの課題とは関係ない話題だが,このような工夫はプログラムの移植性を高める。)でLEDを点滅させ,同時にシリアル通信でコンソールにループ回数を表示させる。表示用の変数は3種類使う。

ex2.c (LED点滅+ループ回数表示プログラム)

/**********************************************************
msecwait関数で0.25秒ごとのLEDのON-OFFを行う
**********************************************************/
#include <3048f.h>
#include "h8_3048.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);
    }
}

実行結果を次のように期待している。

コンソールでの実行予想
左から順にcount1,count2,count3

 1000  2000  3000
 1001  2001  3001
 1002
  2002  3002
 1003  2003  3003
 1004  2004  3004
 1005  2005  3005

スタートアップルーチンとして【2】で作ったstart00.srcを使ってみる。

コンパイル後にできるex2.srcファイルをみると,アドレス未決定のセクション「P,C,D,B」がコンパイラによって作られているのがわかる。
count1は初期化(変数定義時に値が代入されている)されているのでセクションDに,
count2は初期化されていないので
セクションBに,
count3はレジスタE3に割り当てられているのがわかる。

まずは,リンカスクリプトで,P,C,DをROM領域(H'100〜)から割り当て,BをRAM領域(H'FEF10〜)に割り当ててコンパイルリンクしてみよう。
 参考
  セクションP:プログラムコード領域
  セクションC:定数領域
  
セクションB:初期値を持たない静的変数領域
  セクションD:初期値を持つ静的変数領域
    静的変数とは,グローバル変数(関数の外に定義されている変数)やstatic修飾された変数のことである。

リンカスクリプト ex2.sub

START P,C,D(100),B(0FEF10)
EXIT

コンパイルからマイコンへの書き込みまでのwindowsのスクリプトは次のようになる。

具体的手順
(1)シリアルケーブルでマイコンをPCとつなげる
(2)マイコンを書き込みモードで立ち上げる。
(3)「ex2.cmd」をダブルクリック,書き込み終了まで待ち,マイコンの電源を切る。
(4)ハイパーターミナルを立ち上げる
(5)マイコンを実行モードで立ち上げる。

コンパイル用windowsスクリプト ex2.cmd

rem カレントドライブ・カレントディレクトリへ移動
%~d1
cd %~p1

rem コンパイラのパスの設定など
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 ex2.c
asm38 ex2.src
asm38 start00.src

rem リンク
lnk start00.OBJ ex2.OBJ -subcommand=ex2.sub -LIB=%h8library% -O=ex2 -P=ex2

rem Sフォーマットに変換 〜.motの作成
cnvs ex2.abs

n-h8w.exe ex2.mot
pause

ハイパーターミナルにおける実行結果は次のようになる。count1が増えていない!!
プログラムex2.cを再確認してもおかしなところはない。

ハイパーターミナルにおける実行結果
左から順にcount1,count2,count3

 1000  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領域にあるのがわかる。

 LEDは点滅した だろうか。点滅させるためには,P5の出力したいビットに対応したP5.DDRのビットを1にして初期化しておく必要がある。またP5.DRに1を出した り0を出したりしてLEDを点滅させることができる。h8_3048.hの中のLED初期化関数,LED点灯・消灯関数は正しく動作しているかどうか,検 証すべきである。グローバル変数P5DDR,2つの関数内静的変数maskの振る舞いに着目のこと。


                   参考 メモリマップ
メモリの種類 アドレス 備考
ROM 0x00000-0x1FFFF (128kbyte) 実際にはフラッシュメモリ,書き込みモードでのみ書き込むことが出来る。
電源が切れても,内容は保たれる。

割り込みベクタテーブル,プログラム,定数,変数の初期値の格納場所
RAM 0xFEF10-0xFFF0F ( 4kbyte) 電源が切れると内容は消滅する。

変数,スタック(オート変数,戻りアドレス,レジスタ退避)の格納場所

課題2 実際に動作させ,考察しなさい。また調べたことも書きなさい。
count1,count2,count3の様子やLEDの様子。

以下の内容を,考察に含むこと。
(1)ex2.srcファイルを見て,
「count1は初期化(変数定義時に値が代入されている)されているのでセクションDに,
count2は初期化されていないのでセクションBに,
count3はレジスタE3に割り当てられているのがわかる。」
というのは,どのようなところから読み取れるのか。

(2)「.mapファイルを見ると
_count1     H'000009B4
_count2     H'000FEF10
となっており,count1はROM領域,count2はRAM領域にあるのがわかる。」
と説明されているが,その根拠を示しなさい。


(3)h8_3048.h内のグローバル変数P5DDRの役割は何か。またこの変数はRAM領域,ROM領域のどちらに
配置されたか記述しなさい。またその根拠も示しなさい。
LEDが点灯しない理由を述べなさい。


(4)count1の値が変化しない理由を述べなさい。
(sup02.txt)
 
ファイルダウンロード 



【4】LEDの点滅+コンソール表示プログラムでリンカスクリプトの変更

 変数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 %~p1

rem コンパイラのパスの設定など
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 ex2.c
asm38 ex2.src
asm38 start00.src

rem リンク
lnk start00.OBJ ex2.OBJ -subcommand=ex3.sub -LIB=%h8library% -O=ex2 -P=ex2

rem Sフォーマットに変換 〜.motの作成
cnvs ex2.abs

n-h8w.exe ex2.mot
pause

ハイパーターミナルにおける実行結果は次のようになる。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領域にあるのがわかる。

 LEDは点滅しただろうか。点滅させるためには,P5の出力したいビットに対応したP5.DDRの ビットを1にして初期化しておく必要がある。またP5.DRに1を出したり0を出したりしてLEDを点滅させることができる。h8_3048.hの中の LED初期化関数,LED点灯・消灯関数は正しく動作しているかどうか,検証すべきである。グローバル変数P5DDR,2つの関数内静的変数maskの振 る舞いに着目のこと。

課題3 実際に動作させ,考察しなさい。また調べたことも書きなさい。
count1,count2,count3の様子やLEDの様子。

以下の内容を,考察に含むこと。
count1,count2,count3はどこに割り当てられたのか述べなさい。
根拠も示しなさい。

h8_3048.h内のグローバル変数P5DDRはRAM領域,ROM領域のどちらに
配置されたか記述しなさい。またその根拠も示しなさい。

2つの関数内静的変数maskはRAM,ROMのどちらに割り振られたと考えられるか。
(推定しかできない)
そのことは,LEDの点滅動作にどのように影響を与えるか。

count1の値が予想外な変化をした理由を述べなさい。

(sup03.txt)
 
ファイルダウンロード 

【5】「LEDの点滅+コンソール表示プログラム」を正しく動かすための「リンカオプションとスタートアップルーチン」

 コンパイラやアセンブラの段階では,プログラムコードや変数のアドレスはまだ決まっていない。(アドレスを決めてプログラムすることも可能。)アドレスを確定する作業は,リンカの作業である。
 リンカスクリプトには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

リンカスクリプトをこのように変更しても,プログラムはセクション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

次のスタートアップルーチンを使ってみる。

スタートアップルーチン 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
    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
    JMP @LOOP_11
LOOP_1:
    MOV.B @ER0+,R3H         ;source byte to E3H with ER0++
    MOV.B R3H,@ER1          ;E3H to destination
    INC.L #1,ER1            ;increment destination address
    DEC.L #1,ER2            ;ER2--
LOOP_11:
    BNE LOOP_1

    JSR @_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 %~p1

rem コンパイラのパスの設定など
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 ex2.c
asm38 ex2.src
asm38 start01.src

rem リンク
lnk start01.OBJ ex2.OBJ -subcommand=ex4.sub -LIB=%h8library% -O=ex2 -P=ex2

rem Sフォーマットに変換 〜.motの作成
cnvs ex2.abs

n-h8w.exe ex2.mot
pause

ハイパーターミナルにおける実行結果は次のようになる。count1が正しく動作!!

ターミナルにおける実行結果
左から順にcount1,count2,count3

 1000  2000  3000
 1001  2001  3001
 1002  2002  3002
 1003  2003  3003
 1004  2004  3004
 1005  2005  3005

.mapファイルを見ると
_count1     H'000FEF1E
_count2     H'000FEF20
のように,両方の変数がRAM領域にあるのがわかる。初期値がROM上にあることはわからない。

課題4 実際に動作させ,考察しなさい。また調べたことも書きなさい。
(sup04.txt)
 
ファイルダウンロード 


【6】メモリダンププログラムによる検証

 メモリの使用状況を表示してみよう。コンパイル時にリンカの作成するmapファイルを見ながら,何回か作り直して必要な領域を表示するようにしている。

dumpMemoy.c

/**********************************************************
dumpMemory関数でメモリダンプした後
msecwait関数で0.25秒ごとのLEDのON-OFFを行う
**********************************************************/
#include <3048f.h>
#include "h8_3048.h"

void msecwait(int msec)
{
    int i,j;
    for (i=0;i<msec;i++) {
        for (j=0;j<2646;j++);    /*2646は実測によって求めた値*/
    }
}

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,0xd00L); /*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 0a dc 01 00 : z.......k ......
00110 : 6b 21 00 00 0a e0 01 00 6b 22 00 00 0a e4 01 f0 : k!......k"......
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 09 88 40 fe 18 88 38 ba 38 b8 f8 0c 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 0a 9e 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 0a c6 : .EM...h..U.PZ...
00200 : 5e 00 0a 9e 7a 37 00 00 00 12 0f f3 0f 86 19 cc : ^...z7..........
00210 : 0d c5 19 dd 0d d4 19 00 0d 02 0f e0 5e 00 02 fe : ............^...
00220 : 79 01 00 10 0f b0 55 92 68 38 5a 00 02 c2 79 26 : y.....U.h8Z...y&
00230 : 00 2d 46 04 79 0c 00 01 79 26 00 61 4d 0a 79 26 : .-F.y...y&.aM.y&
00240 : 00 7a 4e 04 79 16 ff e0 79 26 00 30 46 04 79 04 : .zN.y...y&.0F.y.
00250 : 00 01 79 2d 00 01 46 2e 79 26 00 30 4d 0c 79 26 : ..y-..F.y&.0M.y&
00260 : 00 39 4e 06 79 36 00 30 40 10 79 26 00 41 4d 0a : .9N.y6.0@.y&.AM.
00270 : 79 26 00 46 4e 04 79 16 ff c9 0d 50 79 08 00 10 : y&.FN.y....Py...
00280 : 52 80 09 60 0d 05 79 24 00 01 46 0a 79 26 00 58 : R..`..y$..F.y&.X
00290 : 46 04 79 0d 00 01 0d dd 46 1a 79 26 00 30 4d 14 : F.y.....F.y&.0M.
002a0 : 79 26 00 39 4e 0e 79 36 00 30 79 00 00 0a 52 50 : y&.9N.y6.0y...RP
002b0 : 09 60 0d 05 0d 26 0b 56 0d 62 0d 60 17 f0 0a b0 : .`...&.V.b.`....
002c0 : 68 08 17 d0 0d 06 58 60 ff 64 79 2c 00 01 46 06 : h.....X`.dy,..F.
002d0 : 0d 50 17 90 0d 05 0d 50 7a 17 00 00 00 12 5a 00 : .P.....Pz.....Z.
002e0 : 0a c6 6d f6 0c 86 a6 0a 46 04 f8 0d 55 f4 28 bc : ..m.....F...U.(.
002f0 : 73 78 47 fa 36 bb 7f bc 72 70 6d 76 54 70 01 00 : sxG.6...rpmvTp..
00300 : 6d f6 0f 86 40 06 68 68 55 d8 0b 76 68 68 46 f6 : m...@.hhU..vhhF.
00310 : 01 00 6d 76 54 70 5e 00 0a 9e 7a 37 00 00 00 38 : ..mvTp^...z7...8
00320 : 18 55 0c 54 18 88 6e f8 00 32 f8 20 6e f8 00 2f : .U.T..n..2. n../
00330 : f8 0a 6e f8 00 33 f8 20 6e f8 00 31 0f f3 0b 93 : ..n..3. n..1....
00340 : 18 dd 6e fd 00 30 1a 80 0f 82 7a 06 00 00 00 50 : ..n..0....z....P
00350 : 0a f6 0b 96 73 0e 47 0e 7a 00 00 00 00 50 0a f0 : ....s.G.z....P..
00360 : 0b 90 0b 70 40 0a 7a 00 00 00 00 50 0a f0 0b 90 : ...p@.z....P....
00370 : 0f 86 7a 00 00 00 00 25 0a f0 01 00 6f f0 00 2a : ..z....%....o..*
00380 : 5a 00 07 62 01 00 6f 70 00 50 68 0c 0c 44 46 40 : Z..b..op.Ph..DF@
00390 : ac 25 46 32 f4 01 18 55 f8 20 6e f8 00 2f 18 88 : .%F2...U. n../..
003a0 : 6e f8 00 33 6e f8 00 32 01 00 6f 73 00 2a 0f b0 : n..3n..2..os.*..
003b0 : 1b 73 18 99 68 89 18 dd 6e fd 00 30 f8 2b 6e f8 : .s..h...n..0.+n.
003c0 : 00 31 5a 00 07 54 0c c8 5e 00 02 e2 5a 00 07 54 : .1Z..T..^...Z..T
003d0 : ac 6c 46 06 70 14 5a 00 05 86 ac 30 4d 2c ac 39 : .lF.p.Z....0M,.9
003e0 : 4e 28 0c 55 46 0e ac 30 46 0a f8 30 6e f8 00 2f : N(.UF..0F..0n../
003f0 : 5a 00 05 86 f8 0a 50 50 08 c8 88 d0 0c 85 a8 20 : Z.....PP.......
00400 : 58 30 01 82 f5 20 5a 00 05 86 ac 2d 46 0a f8 01 : X0... Z....-F...
00410 : 6e f8 00 32 5a 00 05 86 ac 64 46 0c 70 24 f8 0a : n..2Z....dF.p$..
00420 : 6e f8 00 33 5a 00 05 86 ac 75 46 0a f8 0a 6e f8 : n..3Z....uF...n.
00430 : 00 33 5a 00 05 86 ac 78 46 0a f8 10 6e f8 00 33 : .3Z....xF...n..3
00440 : 5a 00 05 86 ac 58 46 0e f8 10 6e f8 00 30 6e f8 : Z....XF...n..0n.
00450 : 00 33 5a 00 05 86 ac 6f 46 0a f8 08 6e f8 00 33 : .3Z....oF...n..3
00460 : 5a 00 05 86 ac 62 46 0a f8 02 6e f8 00 33 5a 00 : Z....bF...n..3Z.
00470 : 05 86 ac 70 46 18 f8 10 6e f8 00 30 6e f8 00 33 : ...pF...n..0n..3
00480 : f5 08 f8 30 6e f8 00 2f 70 14 5a 00 05 86 ac 63 : ...0n../p.Z....c
00490 : 46 3c 0f e4 0b f4 73 0c 47 06 0f c0 0b 70 40 02 : F<....s.G....p@.
004a0 : 0f c0 0f 86 1b f0 01 00 6f f0 00 26 73 08 47 0a : ........o..&s.G.
004b0 : 01 00 6f 71 00 26 1b 71 40 06 01 00 6f 71 00 26 : ..oq.&.q@...oq.&
004c0 : 6e 18 00 01 5e 00 02 e2 18 44 5a 00 05 86 ac 73 : n...^....DZ....s
004d0 : 58 60 00 aa 0c 55 47 72 18 dd 0f e0 0b 90 01 00 : X`...UGr........
004e0 : 6f f0 00 26 73 08 47 04 0b 70 40 06 01 00 6f 70 : o..&s.G..p@...op
004f0 : 00 26 0f 86 1b 90 0f 84 73 08 47 04 1b 70 40 02 : .&......s.G..p@.
00500 : 0f c0 01 00 69 03 40 02 0a 0d 0c d8 17 50 17 70 : ....i.@......P.p
00510 : 0a b0 68 09 46 f2 6e 78 00 32 46 10 0c dc 40 08 : ..h.F.nx.2F...@.
00520 : f8 20 5e 00 02 e2 0a 0c 1c 5c 45 f4 0f b0 5e 00 : . ^......\E...^.
00530 : 02 fe 6e 78 00 32 47 4c 0c dc 40 08 f8 20 5e 00 : ..nx.2GL..@.. ^.
00540 : 02 e2 0a 0c 1c 5c 45 f4 40 3a 0f e0 0b 90 01 00 : .....\E.@:......
00550 : 6f f0 00 26 73 08 47 04 0b 70 40 06 01 00 6f 70 : o..&s.G..p@...op
00560 : 00 26 0f 86 1b 90 0f 84 73 08 47 06 0f c1 1b 71 : .&......s.G....q
00570 : 40 02 0f c1 01 00 69 10 5e 00 02 fe 40 06 0c c8 : @.....i.^...@...
00580 : 5e 00 02 e2 18 44 6e 78 00 33 58 70 01 c6 e4 06 : ^....Dnx.3Xp....
00590 : 0c 48 47 12 a8 02 47 3e a8 04 47 6a a8 06 58 70 : .HG...G>..Gj..Xp
005a0 : 00 98 5a 00 06 a6 0f e0 0b f0 01 00 6f f0 00 26 : ..Z.........o..&
005b0 : 73 08 47 04 0b 70 40 06 01 00 6f 70 00 26 0f 86 : s.G..p@...op.&..
005c0 : 1b f0 0f 84 73 08 47 04 1b 70 40 02 0f c0 69 00 : ....s.G..p@...i.
005d0 : 17 70 5a 00 06 a4 0f e0 0b 90 01 00 6f f0 00 26 : .pZ.........o..&
005e0 : 73 08 47 04 0b 70 40 06 01 00 6f 70 00 26 0f 86 : s.G..p@...op.&..
005f0 : 1b 90 0f 84 73 08 47 04 1b 70 40 02 0f c0 01 00 : ....s.G..p@.....
00600 : 69 02 5a 00 06 a6 0f e0 0b f0 0f 82 73 08 47 04 : i.Z.........s.G.
00610 : 0b 70 40 02 0f a0 0f 86 1b f0 0f 84 73 08 47 04 : .p@.........s.G.
00620 : 1b 70 40 02 0f c0 69 00 17 f0 0f 82 4c 78 17 b0 : .p@...i.....Lx..
00630 : 0f 82 f8 2d 6e f8 00 31 40 6c 0f e0 0b 90 0f 82 : ...-n..1@l<......
00640 : 73 08 47 04 0b 70 40 02 0f a0 0f 86 1b 90 0f 84 : s.G..p@.........
00650 : 73 08 47 04 1b 70 40 02 0f c0 01 00 69 00 0f 82 : s.G..p@.....i...
00660 : 4c 44 17 b0 0f 82 f8 2d 6e f8 00 31 40 38 0f b0 : LD.....-n..1@8..
00670 : 1b 73 1a c4 6e 7c 00 33 01 00 69 f0 0f a0 0f c1 : .s..n|.3..i.....
00680 : 5e 00 0a 62 1a 80 6e 78 00 30 0a 81 78 10 6a 29 : ^..b..nx.0..x.j)
00690 : 00 00 0a e8 01 00 69 70 68 89 0a 0d 0f a0 0f c1 : ......iph.......
006a0 : 5e 00 0a 62 0f 82 0f a0 46 c4 0c dd 46 0a 0f b0 : ^..b....F...F...
006b0 : 1b 73 f9 30 68 89 0a 0d 6e 78 00 2f a8 20 46 48 : .s.0h...nx./. FH
006c0 : 6e 78 00 31 a8 2d 46 0a 0f b0 1b 73 f9 2d 68 89 : nx.1.-F....s.-h.
006d0 : 0a 0d 6e 78 00 32 46 10 0c dc 40 08 f8 20 5e 00 : ..nx.2F...@.. ^.
006e0 : 02 e2 0a 0c 1c 5c 45 f4 0b 73 0f b0 5e 00 02 fe : .....\E..s..^...
006f0 : 6e 78 00 32 47 5c 0c dc 40 08 f8 20 5e 00 02 e2 : nx.2G\..@.. ^...
00700 : 0a 0c 1c 5c 45 f4 40 4a 0c 58 17 50 1b 50 0d 09 : ...\E.@J.X.P.P..
00710 : f9 30 40 08 0f b0 1b 73 68 89 0a 0d 0c d8 17 50 : .0@....sh......P
00720 : 1d 90 4d f0 6e 78 00 31 a8 2d 47 0e 1c 5d 44 0a : ..M.nx.1.-G..]D.
00730 : 0f b0 1b 73 f9 30 68 89 40 10 6e 78 00 31 a8 2d : ...s.0h.@.nx.1.-
00740 : 46 08 0f b0 1b 73 f9 2d 68 89 0b 73 0f b0 5e 00 : F....s.-h..s..^.
00750 : 02 fe 18 44 01 00 6f 70 00 50 0b 70 01 00 6f f0 : ...D..op.P.p..o.
00760 : 00 50 01 00 6f 70 00 50 68 09 58 60 fc 16 7a 17 : .P..op.Ph.X`..z.
00770 : 00 00 00 38 5a 00 0a c6 7a 01 00 0f ef 14 68 18 : ...8Z...z.....h.
00780 : c8 03 68 98 68 19 39 c8 54 70 01 00 6d f6 0d 06 : ..h.h.9.Tp..m...
00790 : 17 f6 78 60 6a 2e 00 0f ef 1b 28 ca 14 e8 38 ca : ..x`j.....(...8.
007a0 : 01 00 6d 76 54 70 01 00 6d f6 0d 06 17 f6 78 60 : ..mvTp..m.....x`
007b0 : 6a 2e 00 00 0b 09 28 ca 16 e8 38 ca 01 00 6d 76 : j.....(...8...mv
007c0 : 54 70 7a 01 00 0f ef 13 68 18 e8 0f 68 98 68 19 : Tpz.....h...h.h.
007d0 : 39 c5 28 da c8 f0 38 da 54 70 01 00 6d f6 0d 06 : 9.(...8.Tp..m...
007e0 : 17 f6 28 c7 78 60 6a 2e 00 00 0b 0b 16 e8 47 04 : ..(.x`j.......G.
007f0 : 19 66 40 04 79 06 00 01 0d 60 01 00 6d 76 54 70 : .f@.y....`..mvTp
00800 : 18 88 6a a8 00 0f ef 11 18 88 38 c1 f8 ff 38 d8 : ..j.......8...8.
00810 : 54 70 01 00 6d f6 0d 06 17 f6 28 c3 78 60 6a 2e : Tp..m.....(.x`j.
00820 : 00 00 0b 0f 16 e8 47 04 19 66 40 04 79 06 00 01 : ......G..f@.y...
00830 : 0d 60 01 00 6d 76 54 70 0d 08 28 6e e8 9f c8 20 : .`..mvTp..(n...
00840 : 38 6e 28 6e e8 e7 38 6e 28 6e e8 f8 c8 03 38 6e : 8n(n..8n(n....8n
00850 : 10 18 1b 58 6b 88 ff 74 7f 70 70 00 7f 70 72 20 : ...Xk..t.pp..pr
00860 : 7f 70 72 10 54 70 0d 08 f8 c3 38 64 f8 b8 38 65 : .pr.Tp....8d..8e
00870 : 79 00 07 cf 6b 80 ff 6c f8 b7 38 6e f8 8a 38 6f : y...k..l..8n..8o
00880 : 1b 58 6b 88 ff 74 f8 f9 38 70 54 70 19 11 40 0a : .Xk..t..8pTp..@.
00890 : 79 08 06 34 1b 58 46 fc 0b 51 1d 01 4d f2 54 70 : y..4.XF..Q..M.Tp
008a0 : 5e 00 0a 9e 0f 86 0f 94 7a 66 ff ff ff f0 0f c0 : ^.......zf......
008b0 : 7a 60 ff ff ff f0 0f 84 7a 00 00 00 0b 17 01 00 : z`......z.......
008c0 : 6d f0 5e 00 03 16 0b 97 5a 00 09 6e 0f e0 7a 01 : m.^.....Z..n..z.
008d0 : 00 00 00 10 5e 00 0a 3c 0f 95 46 16 01 00 6d f6 : ....^..<..F...m.
008e0 : 7a 00 00 00 0b 63 01 00 6d f0 5e 00 03 16 0b 97 : z....c..m.^.....
008f0 : 0b 97 68 68 17 50 6d f0 7a 00 00 00 0b 6c 01 00 : ..hh.Pm.z....l..
00900 : 6d f0 5e 00 03 16 0b 97 0b 87 7a 25 00 00 00 0f : m.^.......z%....
00910 : 46 5a 7a 00 00 00 0b 72 01 00 6d f0 5e 00 03 16 : FZz....r..m.^...
00920 : 0b 97 7a 05 ff ff ff f1 0f e3 0a d3 68 3b 17 53 : ..z.........h;.S
00930 : 0d 30 5e 00 0a 20 0d 00 47 04 0d 32 40 04 79 02 : .0^.. ..G..2@.y.
00940 : 00 2e 6d f2 7a 00 00 00 0b 75 01 00 6d f0 5e 00 : ..m.z....u..m.^.
00950 : 03 16 0b 97 0b 87 0b 75 0f d5 4f cc 7a 00 00 00 : .......u..O.z...
00960 : 0b 78 01 00 6d f0 5e 00 03 16 0b 97 0b 76 1f c6 : .x..m.^......v..
00970 : 58 d0 ff 58 7a 00 00 00 0b 78 01 00 6d f0 5e 00 : X..Xz....x..m.^.
00980 : 03 16 0b 97 5a 00 0a c6 19 33 79 0c 00 01 79 04 : ....Z....3y...y.
00990 : 00 fa 7a 05 00 0f ef 1e 7a 06 00 0f ef 20 79 0b : ..z.....z.... y.
009a0 : 34 56 79 00 23 45 69 e0 5e 00 01 36 5e 00 07 78 : 4Vy.#Ei.^..6^..x
009b0 : 7a 01 00 00 0d 00 1a 80 5e 00 08 a0 7a 01 00 0f : z.......^...z...
009c0 : ef 30 7a 00 00 0f ef 10 5e 00 08 a0 0d b0 0b 5b : .0z.....^......[
009d0 : 6d f0 69 60 0b 50 69 e0 1b 50 6d f0 69 50 0b 50 : m.i`.Pi..Pm.iP.P
009e0 : 69 d0 1b 50 6d f0 7a 00 00 00 0b 7a 01 00 6d f0 : i..Pm.z....z..m.
009f0 : 5e 00 03 16 7a 17 00 00 00 0a 0d 30 5e 00 07 8a : ^...z......0^...
00a00 : 0d c0 5e 00 07 a6 0d 40 5e 00 08 8c 0d 30 5e 00 : ..^....@^....0^.
00a10 : 07 a6 0d c0 5e 00 07 8a 0d 40 5e 00 08 8c 40 ac : ....^....@^...@.
00a20 : 01 00 6d f6 0d 06 17 56 17 76 78 60 6a 28 00 00 : ..m....V.vx`j(..
00a30 : 0b 88 e8 1f 17 50 01 00 6d 76 54 70 6d f2 0d 82 : .....P..mvTpm...
00a40 : 0c 2a 4a 02 17 b0 0d 99 4a 04 d2 80 17 b1 5e 00 : .*J.....J.....^.
00a50 : 0a 62 0c 22 4a 02 17 b0 0c aa 4a 02 17 b1 6d 72 : .b."J.....J...mr
00a60 : 54 70 01 00 6d f2 0d 99 46 10 0d 82 17 72 53 12 : Tp..m...F....rS.
00a70 : 0d a8 53 10 0d 81 0d 28 40 1e 0f 92 0d 81 17 71 : ..S....(@......q
00a80 : 79 08 00 10 12 10 12 31 1a a1 44 02 0a a1 1b 58 : y......1..D....X
00a90 : 46 f2 12 10 17 10 17 70 01 00 6d 72 54 70 01 00 : F......p..mrTp..
00aa0 : 6d f5 01 00 6d f4 01 00 6d f3 01 00 6d f2 01 00 : m...m...m...m...
00ab0 : 6f 72 00 10 01 00 6d f2 01 00 6f f6 00 14 01 00 : or....m...o.....
00ac0 : 6f 72 00 04 54 70 01 00 6d 72 01 00 6d 73 01 00 : or..Tp..mr..ms..
00ad0 : 6d 74 01 00 6d 75 01 00 6d 76 54 70 00 00 0c 88 : mt..mu..mvTp....
00ae0 : 00 0f ef 10 00 00 00 10 30 31 32 33 34 35 36 37 : ........01234567
00af0 : 38 39 61 62 63 64 65 66 30 31 32 33 34 35 36 37 : 89abcdef01234567
00b00 : 38 39 41 42 43 44 45 46 00 fe fd 10 20 40 80 01 : 89ABCDEF.... @..
00b10 : 02 04 08 10 20 40 80 61 64 64 72 65 73 73 20 2b : .... @.address +
00b20 : 30 20 2b 31 20 2b 32 20 2b 33 20 2b 34 20 2b 35 : 0 +1 +2 +3 +4 +5
00b30 : 20 2b 36 20 2b 37 20 2b 38 20 2b 39 20 2b 41 20 :  +6 +7 +8 +9 +A
00b40 : 2b 42 20 2b 43 20 2b 44 20 2b 45 20 2b 46 20 20 : +B +C +D +E +F
00b50 : 20 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 :  0123456789ABCDE
00b60 : 46 0a 00 25 30 35 6c 78 20 3a 20 00 25 30 32 78 : F..%05lx : .%02x
00b70 : 20 00 3a 20 00 25 63 00 0a 00 25 34 78 20 25 34 :  .: .%c...%4x %4
00b80 : 78 20 25 34 78 0a 00 ff 20 20 20 20 20 20 20 20 : x %4x...     
00b90 : 20 60 60 60 60 60 20 20 20 20 20 20 20 20 20 20 :  `````       
00ba0 : 20 20 20 20 20 20 20 20 48 10 10 10 10 10 10 10 :         H.......
00bb0 : 10 10 10 10 10 10 10 10 84 84 84 84 84 84 84 84 : ................
00bc0 : 84 84 10 10 10 10 10 10 10 81 81 81 81 81 81 01 : ................
00bd0 : 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 : ................
00be0 : 01 01 01 10 10 10 10 10 10 82 82 82 82 82 82 02 : ................
00bf0 : 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 : ................
00c00 : 02 02 02 10 10 10 10 20 00 00 00 00 00 00 00 00 : ....... ........
00c10 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00c20 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00c30 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00c40 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00c50 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00c60 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00c70 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00c80 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00c90 : 00 00 00 01 02 00 12 34 ff ff ff ff ff ff ff ff : .......4........
00ca0 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
00cb0 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
00cc0 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
00cd0 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
00ce0 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff : ................
00cf0 : 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 : 00 00 00 00 03 00 00 00 00 00 00 01 02 00 12 34 : ...............4
fef20 : 23 45 ff dd 00 80 ff ff 00 00 ff db 00 04 b7 ff : #E..............

1234 2345 3456
1235 2346 3457
1236 2347 3458
1237 2348 3459
1238 2349 345a
1239 234a 345b


スタートアップルーチンへのアドレス
(vector 0 =00000100)














スタートアップルーチンの先頭
7a 07 00 0f ff 10 は「mov.l H'fff10, ER7」


5e000988 jsr _main














































































































































アドレス988 「19 33:SUB.W R3,R3」
ここがmain()のはじまり




















0adbまでがプログラムコード(.mapファイル情報)
0adcよりセクションC(.mapファイル情報)



























0c87までセクションC(.mapファイル情報)
0c88からセクションD(.mapファイル情報)
0c96の1234が変数count1の初期値







fef1eが変数count1(.mapファイル情報)
fef20が変数count2(.mapファイル情報)

課題5 dumpMemory.cを次の2点について改造し実際に動作させ,メモリの内容表示について
どうしてそのようになるのか考察しなさい。dumpMemoy.cの実行結果の右欄の注釈部分は内容
が変わっていない部分,変わった部分もすべて書き加えなさい,
また調べたことも書きなさい。

(1)関数dumpMemory()の最後に,
    SCI1_printf("\n");
があるが,この行をもう1行増やして,

        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");
    SCI1_printf("\n");
}

のようにする。

(2)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);
    }

の部分を

    int count3=0x3456;
    int i;
    initSCI1(); /*シリアル通信ユニットSCI1の初期化*/
    initLed();  /*LED初期化*/
    dumpMemory(0L,0x1140L); /*ROM領域*/
    dumpMemory(0xfef10L,0xfef30L); /*RAM領域*/
    count2=0x2345;
    dumpMemory(0xfef10L,0xfef30L); /*RAM領域*/
    for (i=0; i<4; i++) {
        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);
    }
    dumpMemory(0xfef10L,0xfef30L); /*RAM領域*/
    while(1);

のように変更する。

(sup05.txt)


 
ファイルダウンロード 

【7】実際のスタートアップルーチンについて

 【5】で示したスタート アップルーチンは,初期化された静的変数を正しく動作させるためのものであった。ANSI−Cによれば,初期化されていない静的変数は0が代入されていな ければならない。またCPUの割り込み許可や禁止操作はCプログラムから頻繁に行いたいが,Cでは記述できず,アセンブリプログラムで記述しなくてはなら ない。そのため,静的変数領域であるセクションBに値0を埋め込む作業と割り込み許可・禁止関数をスタートアップルーチンファイルに書き込んでおいたの が,実用のスタートアップルーチンとなっている。

【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)