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