オフセットの書き方がとても変

このアセンブラ(ASM30)のオフセット記述はとても変だ。
例えばC言語的に書くと


func(short w1, short* w0)
{
w0[5] = w1;
}
ということをやりたいとき

mov w1, [w0 + 5]
のように記述すると、以下のようにエラーである。

Error: Word operations expect even offset.
Error: Invalid operand syntax ('mov w1,[w0+5]').
正しくは

mov w1, [w0 + 10]
と記述しなければいけない。

何がおかしいかというと、ワード・アクセスするのにユーザにバイト・オフセットを指定させること。もちろんバイト・オフセットを書かせる仕様もありなのだが、PIC24のマシン語は操作がバイト(MOV.B)かワード(MOV.W)か識別するフラグを持っていて、それに従ってバイト・オフセットかワード・オフセットか識別する。
つまりユーザにバイト・オフセットを書かせておきながら、マシン語に変換するときわざわざワード・オフセットに変換しているのだ。先の例なら、マシン語に組み入れられたオフセット値は「+5」である。

こんな無意味なことをアセンブラ開発者が好きでやるとは思えないので、Cコンパイラがバイト・オフセットで出力するから、泣く泣く仕様を合わせたのかも知れない。
でもユーザ(少なくても私個人)としてワード・オフセットを書かせて欲しかったな。
とても気持ちが悪いので、オフセット値はすべて.equivでシンボル定義して、かつ値に「2*」を付けることにする。