読者です 読者をやめる 読者になる 読者になる

外資系戦略コンサルタントの思考と興味

デジタルとビジネスと人の関わりについて、考えごとをしています

アセンブラコーディングの失敗例

今回のコーディングでデバッグ時に判明した(初歩的な)ミスについて、
備忘録をまとめておきます。

Module Exit時のブランチ

モジュールプログラムのExitでは、親プログラムから渡されたレジスタ
アドレスを返す必要があります。

これをうけて、戻りの際には、

BR R14

としなければならないのですが、そこはアセンブラ初心者……。

B R14

こうしてしまうと、レジスタの絶対値アドレスへブランチしてしまうので、0C4です。
親プログラムへ戻れません。

みなさんも気をつけましょう(ないと思いますが……)。

MVCコマンドの使用方法間違え

言わずと知れたMVCコマンドです。データのコピー等で頻繁に使います。
例えば、以下の例だと、work2の5バイト目(添え字が0から始まるので、

  1. 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でセットされるので、前述のようなずれは発生しなくなります。

みなさんも気をつけましょう(ないと思いますが……)。
って、しつこいですか? すいません。

一番役立つSystem zのサイト

社内サイトではなくて恐縮ですが、こちらのサイトが今のところ、一番詳しいと思います。
メインフレーマーはブックマークしておくと良いかと。

メインフレーム入門


「こんな時代に今さらメインフレーム・コンピュータに取り組むハメになったみんなが助けあうサイトです。」※サイトより


つらつらと書いてきたアセンブラ修行メモですが、コーディングも一段落したため、
これでいったんは完了にしたいと思います。

質問・リクエストありましたら、いつでもコメントをお願いします。