[H8-ML(4689)] 【解決】 アセンブラの仕様のために使えないディスプレースメントがある。
From: 先尾翼 <mhirota@xxxxxxxxxxxxx>
Date: 2004年04月15日(木)00時27分06秒
こんばんは、廣田@埼玉辺境地です。

この問題、解決しました。
日立&ルネサスに訊いたわけではではありませんが、簡単なことでした。

理由はこうです。

CPUはwordアクセス、ロングワードアクセス時、dispをx2、x4倍して
参照する。しかし、プログラマからみたらそんなことは七面倒くさいことだ。

そこで、アセンブラの処理仕様はdispの値を記述する場合、予め2倍、4倍の
disp値を書かせる事にし、アセンブリするとき、書かれた値を1/2、1/4
にしてddddddddに入れ込む。

これにより、プログラマは「dispがx2倍、x4倍される」と言うことを意識の外
に置けるということで、バイトアクセス mov.b r0,@(disp,gbr)と全く同様に扱え
るというメリットがある。

例:
DADRH	.equ	H'8380
DADRL	.equ	H'8382
	:
	mov.w	#DADRH,r1	;ポートAの上位ワードをベースとする。
	ldc	r1,gbr
	mov.w	@(0,gbr),r0	;ポートAの上位ワードをよみ、
	mov.w	r0,@(2,gbr)	;下位ワードに書き込む。
	:
このように絶対アドレスで2バイト(1ワード分)離れている場所を参照するとき、
そのまま(2,gbr)と言うように見た目通り(バイト単位)に書けるのです。
こう書けば「アセンブラは1/2にして」「CPUはx2にして」結局プログラマが
書いたdisp値通りの場所を参照するのです。

この件についてはwebのマニュアル rjj10b0052_sh.pdf の
「11.アセンブラ言語仕様 11.2.1実行命令の概要 p574〜p577」に詳しく
記述されていました。


> hamayan です。
> 補足です。
> ハードウエアマニュアルの説明は、マシン語をどう展開するかを説明し
> ているので、アセンブラの振る舞いを説明しているのでは無い・・・んですよね。
> プログラミングの事は、やはりプログラミング専用のマニュアルを読む
> 方が宜しいかと。

この件は、「プログラミングマニュアル」には記述がなく、アセンブラマニュアルに
「アセンブラの処理、言語仕様」として書かれていたことは前述の通りです。

ちなみに、今回、(disp,gbr)の命令を使った部分は約80箇所ありました。
そのうち半分が mov.b r0,@(disp,gbr)、 残りがmov.w 〜 だったのですが、
去年暮れに書いた部分(つまり既に動作検証が済んでいる部分)はすべて、(偶数,gbr)に
なっていました。
どうやら、dispをx2にして参照するなんて言うことに気づいていない書き方でした。
結果としてx2を意識しないで書いた部分が正常に動作していたのです。

みなさま、お騒がせしました。

-- 
// Name "Hirota Masataka"
// Address mhirota@xxxxxxxxxxxxx

スレッド概略
[4682(R)](起点)
 └[表示中]


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


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