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