こんばんは、廣田@埼玉辺境地です。
また、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