[H8-ML(1470)] H8/3664 jsr問題
From: "(^o^) Masahiro Ochiai" <user@xxxxxxxxxxxxx>
Date: 2001年12月08日(土)01時09分37秒

こんばんは 落合です。

H8/3664でプログラム作ってます。過去のログに無いようでしたので送信しました。

−gcc-2.95.2上での話です。−

H8tinyシリーズはH8/300Hの他のCPUと違って、実効アドレスが16ビットとコンパクトになっています。

割り込みベクタも全て16ビット幅です。マニュアルに具体的な記載が見あたらないのですが、jsr命令で

も同様に2バイトの戻りアドレスがスタックに詰まれると思います。そうすると、jsr先の関数で引数を参照

した際に、コンパイラは戻りアドレスを4バイトと想定して、スタックフレームのオフセットを計算してしまう

ので、正しく引数を取得できないようです。

引数が(32ビット幅以下で)3個以下の場合はレジスタER0,ER1,ER2にそれぞれ第1〜3の引数が入ってjsrされます

ので問題ありません。4個を超えると超えた分はスタックに詰まれてからjsrされます。


	sub.l er4,er4
	add.b #4,r4l
	mov.l   er4,@-er7		; 第4引数(=4)(スタックに)
	mov.l   #_count,er2		; 第3引数(=&count)
	sub.l   er1,er1			; 第2引数(=0)
	sub.l   er0,er0			; 第1引数(=0)
	jsr @_subroutine		; 関数CALL

_subroutine:
	push.l er6
	mov.l er7,er6
	...
	mov.l   @(8,er6),er4		; 第4引数の取り出し(not equal 4?)

上記の最後の行だとうまく取り出せないと思うのですが、正しくは

	mov.l   @(6,er6),er4		; 第4引数の取り出し

ではありませんか? もしくは私のコンパイルオプションが違っているのでしょうか?

	CFLAGS  =   -mh -mrelax -mint32 -DH8_3664 -O -Wall

Tiny用のコンパイルオプションってないですよね?

動かしているのは binutils-2.11.2, gcc-2.95.2/linux です。

#
#  別件で、I2Cもうまく動いてくれません。(+_+)   やっぱり、TinyのI2Cはダメかぁ?

-- 
Masahiro OCHIAI
http://strawberry-linux.com/h8/
スレッド概略
[1414(R)](起点)
 └[1469(U)]
   └[表示中]
     └[1474(1)]


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


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