[H8-ML(2572)] Re: 20KB を超えると転送できない??(セクションの初期化)
From: "Fujisawa Toru" <fujisawa@xxxxxxxxxxxxxxxxxxxxx>
Date: 2002年12月14日(土)09時28分39秒
hamayanさん、TK303さん、お世話になっています。
神工大の藤澤です。いつも亀レスですみません。

TK303さんwrote:

> >C プログラムの実行環境を設定するために、未初期化データ領域をゼロで
> >初期化することと、ROM 上にある初期化データをRAM 上にコピーすることが
> >必要です。このルーチンは標準ライブラリのライブラリ関数「__INITSCT」
> >として提供していますので、「(2 )初期設定(INIT)」に示すように、
> >初期設定ルーチンの中で「__INITSCT」関数を呼び出すだけで実現できます。

> まずはコンパイラ、リンカメーカー提供のマニュアルを(探してきて)
> 見ることをお勧めします。

私は秋月のCコンパイラを使っています。手元にはこれしかありません。
そういえば、日立のコンパイラでは__INITSCを使うというのは、トラ技2001年
6月号に記載がありましたね。付録のCD-ROMを見たら日立のマニュアルにご
指摘の部分が明記されていました。しかし秋月のコンパイラマニュアルにはそ
のような説明は1ページも無いのですが、スタック使用量一覧表というところに
__INITSCTを発見しました。それじゃ動くの?とmain()関数の最初に_INITSC();
を入れてみたところ、すんなりコンパイルを通って動作してくれました。


hamayanさんwrote:

> mov.l	#(STARTOF D),er5
> で、Dセクションのアドレスを取得できます。
> 同様の手順で、
> mov.l	#(STARTOF R),er6
> で、Rセクションの取得、
> mov.l	#(SIZEOF D),er4
> で、Dセクションのサイズ、
> 後はこの二つのアドレス間で、データ−のコピーを行えば良いのです。
> クリアは、
> mov.l	#(STARTOF B),er5
> mov.l	#(SIZEOF B),er4
> でクリアするコードが書けると思います。

関数に頼らずC言語を使って手動で初期化する場合についても日立のマニュ
アルに載っていたので、簡単に理解できました。
ところでアセンブラだとどうなるのか素人なりにトライしてみたのですが、
合っていますか??

	MOV.L	#(STARTOF B),ER5
	MOV.L	#(SIZEOF B),ER4
BCLR:	MOV.B	#H'00,@ER5
	DEC.L	#1,ER4
	BNE	BCLR

	MOV.L	#(STARTOF D),ER5
	MOV.L	#(STARTOF R),ER6
	MOV.L	#(SIZEOF D),ER4
DTOR:	MOV.B	@ER5,R0H
	MOV.B	R0H,@ER6
	DEC.L	#1,ER4
	BNE	DTOR

P.S.液晶の文字化け云々はヌル文字の書き忘れでした。
  (もはや記憶に無い??)

---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.427 / Virus Database: 240 - Release Date: 2002/12/06


スレッド概略
[2478(R)](起点)
 └[2525(U)]
   └[表示中]
     ├[2573(1)]
     └[2577(2)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]