今回のコーディングでデバッグ時に判明した(初歩的な)ミスについて、
備忘録をまとめておきます。
Module Exit時のブランチ
モジュールプログラムのExitでは、親プログラムから渡されたレジスタに
アドレスを返す必要があります。
これをうけて、戻りの際には、
BR R14
としなければならないのですが、そこはアセンブラ初心者……。
B R14
こうしてしまうと、レジスタの絶対値アドレスへブランチしてしまうので、0C4です。
親プログラムへ戻れません。
みなさんも気をつけましょう(ないと思いますが……)。
MVCコマンドの使用方法間違え
言わずと知れたMVCコマンドです。データのコピー等で頻繁に使います。
例えば、以下の例だと、work2の5バイト目(添え字が0から始まるので、
- 4で5バイト目になる)からwork1の頭から4バイトへコピーします。
MVC work1(4),work2+4
これをレジスタを使用して書くと、こんな感じになります。
MVC 0(4,R1),4(R2)
なんですが……、変異とデータを間違えて、こんな風になっていました。
MVC 4(0,R1),4(R2)
これはアセンブルでエラーになるわけではないですが、
ロジックとしては、完全にアウトですね。
みなさんも気をつけましょう(ないと思いますが……)。
Boundaryのずれ
これは問題判別に手こずりました。というのは、Dumpが読めない自分のせいですが。
アセンブラでは基本的には4バイトBoundary(フルワード)でステートメントが構成されます。
エラーに陥ったのは、下記のような例です。
PARMLIST 0CL24
PARM1 F(CL4分)
PARM2 F
PARM3 F
PARM4 F
PARM5 F
PARM6 F
ところが、文字でデータ名を定義しようとしたため、dump解析の結果、
オクテットが2バイトずれていることがはんめいしたのです!!
基本的なミスだなー、と大先輩は言うのですが、
俺からすればビックリのエラーですよ。
そんなんもあるのか…と。
解決するためには、BoundaryをきちんとFで合わせればよいので、
こんな風にします。
PARMLIST 0F ←Boundaryあわせ
PARM1 F
:
こうすることで、BoundaryがFでセットされるので、前述のようなずれは発生しなくなります。
みなさんも気をつけましょう(ないと思いますが……)。
って、しつこいですか? すいません。