プログラムをコーディングする際に、複数行のリピートやカット&ペーストを使って既にコーディング済みのロジックを複製してその内容の一部を変えて使うような場合があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
SUBRTN1 DS 0H +----------+ : I : I ここをコピーして LTR R1,R1 CHECK INPUT PARAMETER I BNZ SUBRTN1B IF NOT ZERO... I : I : +----------+ ┃ ┃ ▼ SUBRTN2 DS 0H <-- ラベル名は重複する +----------+ : とエラーになるのですぐ気づく I : I 貼り付ける LTR R1,R1 CHECK INPUT PARAMETER I BNZ SUBRTN1B IF NOT ZERO... I : ~~~~~~~~ 直し忘れやすい I : +----------+ |
本来なら似たようなロジックの内部サブルーチンなどは、処理内容を整理して1つにまとめるなどをした方がいいのですが、既存のソースに機能を追加するような場合、今まで動いていた部分になるべく手を付けないようにしたいということはよくあることです。そのため、コピーして内容の一部を少し変えて使うということはありがちです。この時、ラベル名などは重複すれば当然アセンブラーがエラーにするのでわかりますし、ペーストした時点で最初に直してしまうような箇所です。しかし、ロジック内の分岐命令の飛び先などは十分に注意しないと直し忘れやすい部分です。参照先は新規に書いた名前ではないのでアセンブル時にエラーにはなりません。
この例のように、新たに作った内部サブルーチンSUBRTN2を呼んだ時、ルーチン内に条件分岐命令があってその条件に一致するような場合、コピー元のラベル名のアドレスへ飛んで行ってしまいます。その後に実行結果がおかしかったりABENDしたりした場合、その原因が意外とわかりにくかったりします。複数行のブロック・リピートやカット&ペーストは便利でコーディングの生産性を上げますが、似たようなロジックを安易に複製するとこういうことも起きると意識しておくといいでしょう。アセンブラー言語に限らず、どのような言語のプログラムであっても同じでしょう。