VS COBOL II の場合、アセンブラー・プログラムは、AMODE 指定に関係なく COBOL プログラ
ムを呼び出すことができました。以下に例を示します。
図 1. プログラムを呼び出す場合の AMODE の影響
上の図では、以下のことが行われます。
- プログラム COBOLA が AssemblerA を動的に呼び出しま
す (アセンブラーは AMODE 31 です)。
- AssemblerAが COBOLB をロードします。COBOLB は RENT、DATA(24)、および AMODE(24) です。
- AssemblerA が COBOLB への BALR を行います (COBOLB は AMODE 31 で入られました)。
- COBOLB が AssemblerA に戻ります。
- AssemblerA が AssemblerB を呼び出します。
- AssemblerB が COBOLB への BASSM を行います (COBOLB は AMODE 24 で入られました)。
- COBOLB は、AMODE 31 で入られることを予期しているため、異常終了します。
言語環境プログラムの場合、VS COBOL II、IBM COBOL、または Enterprise COBOL でコンパイルされ、アセンブラー・プログラムによって呼び出される COBOL プログラムは、それが呼び出されるたびに同じ AMODE で入れられる必要があります。
上の例で異常終了を避けるためには、
- ステップ 2 で、AssemblerA は AMODE を保存する必要があります。
- ステップ 3 で、AssemblerA は COBOLB へ
の BASSM (BALR ではなく) を行う必要があります。
- ステップ 4 で、AssemblerA はステップ 2 で保存した AMODE を復元する
必要があります。
AMODE 31 であるアセンブラー・プログラムが AMODE 24 である COBOL プログラム
を呼び出す場合、COBOL がアセンブラー・プログラムに戻るためには、アセンブラー・プロ
グラムは RMODE 24 であることも必要です。この場合、アセンブラー・プログラムが AMODE ANY であれば、COBOL プログラムからの
戻り時に、無効アドレスへの分岐の結果として異常終了が発生する可能性があります。その理由は、R14 にはアセンブラー・プログラムの保存域からの 31 ビット・アドレスが
入りますが、COBOL は AMODE 24 でアセンブラー・プログラムに戻るためです。