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

また、h8からはオフトピックの話題で申し訳ありませんが。

SHを使い慣れているかたは既に常識なのでしょうが、久しぶりにSHのプログラムを
書いていると不思議なことに出会いました。
HEW2のアセンブラでは下記命令はワーニング870なってしまい使えませんでした。

	mov.w	r0,@(奇数のディスプレースメント,gbr)

この命令はr0の値を(gbr+ディスプレースメント(disp)×2)で示される場所に格納する
命令ですが、アセンブラは奇数を「不当な値だから偶数にしろ」と言ってワーニングを
出します。
しかし、これはちょっと変です。
dispが奇数であれ、偶数であれx2するのですから結局偶数になります。gbrの値も
当然偶数である必要がありますが、入力されるdispは8ビットでありさえすれば
偶数、奇数を問わないはずです。

げんに、プログラミングマニュアルでは
> ワードサイズのとき8ビットディスプレースメントはゼロ拡張後 2 倍しますので、+510
> バイトまでの範囲が指定できます。 
と書いてあります。dispは8ビットですからH'FF = 255(奇数) これをx2して510となる
わけです。アセンブラの仕様通りなら、dispの最大値はH'FE =254, x2して+508バイト
までしか範囲指定できない事になります。
また、wov.w r0,@(disp,gbr)の命令コードは

 11000001dddddddd

であり、ddddddddがdispです。 このようにLSB=1を使える事になっています。
昔のマニュアルでも、webの最新版のマニュアルでも同様です。

このワーニング870ですが、ワーニングを出すだけならまだいい方ですが、
おせっかいにもdispのLSBを切り捨て、強制的に偶数にしてしまいます。

> オペレーションサイズがワードのときにディスプレースメントが偶数となっていません。
 :
> アセンブラがディスプレースメントを補正することを考慮してください。
> アセンブラはオペレーションサイズに応じてディスプレースメントを補正してオブジェ
> クトコードを生成します。
> オペレーションサイズがワードのときはディスプレースメントが偶数になるように切り
> 捨てます。

私は、この命令を以下のように使ってワードバウンダリでデータを書こうとしたのですが
奇数dispが使えないため、仕方なく他の記述としました。
    :
   wov.w  r0,@(0,gbr)	;gbrが示している場所にデータを格納
   mov.w  @r1+,r0
   mov.w  r0,@(1,gbr)	;gbr+2に格納
   mov.w  @r1+,r0
   mov.w  r0,@(2,gbr)	;gbr+4に格納
   mov.w  @r1+,r0
   mov.w  r0,@(3,gbr)	;gbr+6に格納
  :

どうしても使いたいからと
    :
  mov.w  @r1+,r0
 .data.w B'1100000100000011	;mov.w r0,@(3,gbr)
    :
と書くしかないかなぁ?

これは「仕様」というバグでは? それともプログラミングマニュアルが
間違ってる?
いまさらまさかねーーー?
この投稿する前に、ルネサスのwebでマニュアルの訂正やコンパイラアセンブラ
のバージョンアップ情報を見てみましたが、この部分に関する資料は
無かったです。
Cコンパイラの不具合と修正モジュールについてはたくさんありましたが。

では。


-- 
// Name "Hirota Masataka"
// Address mhirota@xxxxxxxxxxxxx
スレッド概略
[表示中](起点)
 ├[4676(1)]
 ├[4677(2)]
 ├[4680(3)]
 └[4681(4)]


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


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