これからメインフレーム・コンピューターのアセンブラー・プログラミングを覚えようとする方向けに、基本的な命令の動きやレジスターに読み込んだ内容やメモリーに書き込んだ内容を簡単に見るためのひな型プログラムを用意しました。JCLと一体になっているので必要な命令とデータを記述してサブミットすれば、実行結果をSYSOUTに出力できます。
z/OSで実際に動かせるアセンブラープログラムを作るには、単に実行させたい命令やデータを書くだけでは済みません。OSから呼び出された時点での最低限必要な手続きや、実行結果の編集・出力が必要になります。そのためにはMVSやDFSMS(データ管理)のAPIも合わせて学ばねばなりません。あるいは、実行させたい命令の直後でわざとABENDさせてダンプを出力し、そのダンプ・リストからレジスターやメモリーの内容を見るかです。どちらの方法も全くのビギナーには少々敷居が高いです。
このひな型を使えば、純粋に試して見たい命令やデータを書くだけで容易にテストすることができ、基本的な命令の動きを実際に動かして理解してから次のステップへ進むことができます。
上記のひな型プログラムは、アセンブルとバインドによって生成されたロード・モジュールをバッチTSO環境でTESTコマンドによって実行するものです。TESTコマンドのブレーク機能を利用して、指定したブレーク・ポイントを通過した際のレジスターとメモリー(指定した範囲)の内容をSYSOUTに出力します。
実行後のSYSOUT(TESTコマンドの出力内容)を参照することで、自分が書いた命令が実行された結果を具体的に目視して確認することができます。命令によってレジスターやメモリーがどう変化したかを、ひな型プログラム①ではある程度の処理を行った結果をまとめて、ひな型プログラム②では一定範囲の処理を1命令ずつ実行して結果を確認することができます。
ひな型プログラムJCLの使い方
ダウンロードしたひな型プログラムJCLを、任意のPDS/PDSEデータセットに任意のメンバー名で格納します。(FTP、3270エミュレーターのファイル転送あるいはISPFエディターでのコピー&ペースト等でメンバー登録します)
このひな型自身はJCLになっています。JCLのストリーム内データセットとしてアセンブラー言語のプログラムが記述してあり、その中で案内された部分に試してみたい命令とデータを書いてサブミットすれば実行されます。コーディングの構文に誤りがあれば、アセンブルのステップでエラーになり後続ステップは実行されずにジョブは終了します。アセンブルが通れば続いてバインダーが実行されロード・モジュールが作成されてから最後にバッチTSO環境のステップが実行され、JCL内に記述したアセンブラー・プログラムがTSOのTESTコマンドによって実行されます。記述した機械命令の実行経過は、ステップGのSYSTSPRT DDステートメントに出力されます。
1. ひな型プログラムJCLを修正する
下記のJCLは「アセンブラー学習用のひな型プログラムJCL①」の冒頭部分です。必要ならJOBステートメントを使用するシステムの規約に合わせて修正し、ジョブ名も利用するz/OSシステムの利用規約に併せて修正して下さい。呼び出しているカタログ・プロシージャーASMACLはHLASM(高水準アセンブラー)の標準提供プロシージャーです。特定のシステムに依存する部分はありませんので、JOBステートメントだけ修正すれば実行することができます。なお、JOBステートメントのTIMEとLINESパラメーターは削除しないことを勧めます。プログラムがループした場合、S322もしくはS722でABENDさせるために最大CPU時間を20秒、最大出力量を1万行に設定してあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//ASMLEARN JOB (ACCT),NAME,NOTIFY=&SYSUID,TIME=(,20),LINES=(10,CANCEL) //********************************************************************* //ASMACL EXEC ASMACL,COND.L=(8,LE,C), // PARM.C='ASA,TEST,US(WARN(11))',PARM.L='MAP,LET,LIST,TEST' //C.SYSIN DD * *********************************************************************** * z/Architecture & z/OS Assembler Learning Program * * ===================================================== * * Program member name GO is fixed. That is created by * * ASMCL/ASMCLG HLASM Standard Procedure. * *********************************************************************** : :(途中省略) : //********************************************************************* //G EXEC PGM=IKJEFT01,COND=((8,LE,ASMACL.C),(8,LE,ASMACL.L)) //STEPLIB DD DISP=(OLD,DELETE),DSN=&&GOSET //SYSTSPRT DD SYSOUT=* //SYSTSIN DD * TEST *(GO) 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' AT MAINPROC (L 0R:15R;L 1R%-2 XC L(64)) AT EXITPROC (L 0R:15R;L DATAAREA:WORKAREA XC;L WORKAREA XC L(256)) GO GO // // // |
なお、最初のEXECステートメントのステップ名ASMACLを変更する場合は、プログラム・コードの後ろに記述されたステップGのEXECステートメントにあるCONDパラメーター内の先行ステップ名も併せて修正しなければなりません。特別な理由が無ければ、最初のEXECステートメントのステップ名ASMACLはそのままにしておくことを勧めます。
2. アセンブラー・プログラムを記述する
ひな型の40行目前後にある「MAINPROC」というラベル以降の部分に試したい命令や実行したい処理を書いて下さい。「ここに実行したい機械命令コードを書いて下さい。」という日本語のコメントが書いてある部分です(ファイル転送やISPFエディターでの貼り付け時に文字化けしている場合は、元のテキスト・ファイルを見て下さい)。データに関しては、ひな型の60行目辺りにある「DATAAREA」というラベル以降の部分にDCやDS命令でのデータ定義を書いて下さい。「ここに機械命令で参照するデータを書いて下さい。」という日本語のコメントが書いてある部分です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
: :(冒頭省略) : *********************************************************************** * AVAILABLE YOUR ASSEMBLER LANGUAGE CODE AT HERE. * * ===================================================== * * GR0 ---> EXEC PARAMETER TEXT LENGTH * * GR1 ---> EXEC PARAMETER TEXT ADDRESS * * GR13 --> OUR REGISTER SAVEAREA(RSA) * *********************************************************************** MAINPROC DS 0H * ここに実行したい機械命令コードを書いて下さい。 SLR R15,R15 CLEAR COMPLETION CODE(CC=0) *********************************************************************** * *----------------------------------* * * PROGRAM EXIT PROCEDURE * * * ============================== * * * GR15 --> COMPLETION CODE(RETCD * * *----------------------------------* EXITPROC DS 0H EXIT PROCEDURE AT HERE L R13,4(,R13) LOAD CALLER'S SAVEAREA ADDRESS RETURN (14,12),T,RC=(15) RESTORE CALLER'S REGISTERS + AND RETURN TO CALLER WITH RETCD *********************************************************************** * DATA AREA * *********************************************************************** GPRSAVEA DS 18F STANDARD GPR SAVEAREA(18WORDS) *---------------------------------------------------------------------* * AVAILABLE YOUR ASSEMBLER LANGUAGE DATA AT HERE. * *---------------------------------------------------------------------* DATAAREA DS 0D USER DATA AREA START AT HERE * ここに機械命令で参照するデータを書いて下さい。 *---------------------------------------------------------------------* WORKAREA DS XL256 --- 256BYTES WORKING AREA --- *---------------------------------------------------------------------* : :(以下省略) : |
下記に追加した命令とデータのサンプルを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
*********************************************************************** * AVAILABLE YOUR ASSEMBLER LANGUAGE CODE AT HERE. * * ===================================================== * * GR0 ---> EXEC PARAMETER TEXT LENGTH * * GR1 ---> EXEC PARAMETER TEXT ADDRESS * * GR13 --> OUR REGISTER SAVEAREA(RSA) * *********************************************************************** MAINPROC DS 0H L R2,=A(X'22222222') GR2 <--- X'22222222' L R3,=A(X'33333333') GR3 <--- X'33333333' L R4,=A(X'44444444') GR4 <--- X'44444444' L R5,=A(X'55555555') GR5 <--- X'55555555' L R6,=A(X'66666666') GR6 <--- X'66666666' L R7,=A(X'77777777') GR7 <--- X'77777777' L R8,=A(X'88888888') GR8 <--- X'88888888' L R9,=A(X'99999999') GR9 <--- X'99999999' L R10,=A(X'AAAAAAAA') GR10 <-- X'AAAAAAAA' L R11,=A(X'BBBBBBBB') GR11 <-- X'BBBBBBBB' L R0,FWORD1 LOAD FWORD1 ST R0,DWORD STORE IT INTO DWORD LH R1,HWORD1 LOAD HWORD1 ST R1,DWORD+4 STORE IT INTO DWORD+4 LH R1,HWORD2 LOAD HWORD2 CVD R1,DWORD CONVERT IT TO PACKED-DECIMAL MVC WORKAREA(10),CHAR2 MOVE CHAR2 TO WORKAREA SLR R14,R14 CLEAR WORKREG LA R15,5 LOAD LOOP COUNT LOOP DS 0H AHI R14,+1 INCREMENT R14 BCT R15,LOOP DO UNTIL R15=0 *********************************************************************** : :(途中省略) : *---------------------------------------------------------------------* * AVAILABLE YOUR ASSEMBLER LANGUAGE DATA AT HERE. * *---------------------------------------------------------------------* DATAAREA DS 0D USER DATA AREA START AT HERE * DWORD DC D'0' x0000000000000000 FWORD1 DC F'12345' x00003039 FWORD2 DC FL3'-875' xFFFC95 HWORD1 DC H'6789' x1A85 HWORD2 DC H'-123' xFF85 * CHAR1 DC C'A' 'A' CHAR2 DC CL10'ABCDEFGH' 'ABCDEFGH ' CHAR3 DC 3CL2'XY' 'XYXYXY' CHAR4 DC CL8'12345' '12345 ' HEX1 DC X'00' x00 HEX2 DC XL4'123' x00000123 PACK1 DC P'12345' x12345C PACK2 DC PL6'+3456789' x00003456789C PACK3 DC P'-875' x875D PACK4 DC PL3'-875' x00875D ZONE1 DC ZL8'12345' ' 1234E' * ADDR1 DC A(GPRSAVEA) x00000xxx ADDR2 DC AL3(CHAR1) x000xxx *---------------------------------------------------------------------* WORKAREA DS XL256 --- 256BYTES WORKING AREA --- *---------------------------------------------------------------------* |
3. ひな型プログラムJCLを実行する
下記のJCLは「アセンブラー学習用のひな型プログラムJCL①」の終盤部分です。2つ目のEXECステートメントが、JCL内に記述したアセンブラー・プログラムを実行するステップです。このステップのSYSTSIN DDステートメントで、TSOのTESTコマンドを起動してJCL内に記述したアセンブラー・プログラムを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
: :(ここ迄省略) : *---------------------------------------------------------------------* WORKAREA DS XL256 --- 256BYTES WORKING AREA --- *---------------------------------------------------------------------* YREGS , EXPAND GPR EQUATIONS(z/OS ONLY) END REPRO PAGE MAINPROG END //********************************************************************* //G EXEC PGM=IKJEFT01,COND=((8,LE,ASMACL.C),(8,LE,ASMACL.L)) //STEPLIB DD DISP=(OLD,DELETE),DSN=&&GOSET //SYSTSPRT DD SYSOUT=* //SYSTSIN DD * TEST *(GO) 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' AT MAINPROC (L 0R:15R;L 1R%-2 XC L(64)) AT EXITPROC (L 0R:15R;L DATAAREA:WORKAREA XC;L WORKAREA XC L(256)) GO GO GO // // // |
SYSTSIN内の1行目がTESTコマンドの起動です。*(GO)は、標準探索ライブラリー(STEPLIBやLINKLIB等)内のメンバーGOを実行することを示します。’ABCDEFGH・・・STUVWXYZ0123456789’は、プログラムへ渡すパラメーター文字列です。EXECステートメントのPARMパラメーターに相当します。
2行目と3行目のATサブコマンドは、ブレーク・ポイントの設定です。プログラム内のラベルMAINPROCとEXECPROCの位置にそれぞれブレーク・ポイントを設定します。()で囲まれたATサブコマンドの2つ目のパラメーターは、ブレーク・ポイントに到達した際に実行するTESTのサブコマンドです。Lサブコマンドはレジスターやメモリー内容を出力します。続くGOサブコマンドは、プログラムの実行開始とブレーク・ポイントからの再開を指示します。最初のTESTコマンドと続く2つのATサブコマンドに対応して全部で3つのGOサブコマンドを指定しています。
下記にサンプルの実行結果(SYSTSPRT)を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
READY TEST *(GO) 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' TEST AT MAINPROC (L 0R:15R;L 1R%-2 XC L(64)) TEST AT EXITPROC (L 0R:15R;L DATAAREA:WORKAREA XC;L WORKAREA XC L(256)) TEST GO <--- プログラムの実行を開始 IKJ57024I AT MAINPROC <--- ブレーク・ポイントMAINPROCに到達したことを示す 0R 00000024 1R 00022F3E 2R FFFFFFFF 3R FFFFFFFF <--- ブレーク・ポイントMAINPROC到達時のレジスター内容 4R FFFFFFFF 5R FFFFFFFF 6R FFFFFFFF 7R FFFFFFFF (まだMAINPROCの命令は実行していない) 8R FFFFFFFF 9R FFFFFFFF 10R FFFFFFFF 11R FFFFFFFF 12R 00023000 13R 000230CC 14R 00BAEB6C 15R 00022F68 00022F3C. 0024C1C2 C3C4C5C6 C7C8C9D1 D2D3D4D5 *..ABCDEFGHIJKLMN* <--- ブレーク・ポイントMAINPROC到達時の D6D7D8D9 E2E3E4E5 E6E7E8E9 F0F1F2F3 *OPQRSTUVWXYZ0123* レジスター1が示すアドレスの2バイト前からの 00022F5C. F4F5F6F7 F8F90000 00000000 00000000 *456789..........* 64バイトのメモリー内容 00000000 000230CC 00BAEB6C 00023000 *...........%....* (EXEC PARMパラメーター文字列、先頭2バイトは文字列の長さ) TEST GO <--- プログラムの実行再開を指示 IKJ57024I AT EXITPROC <--- ブレーク・ポイントEXITPROCに到達したことを示す 0R 00003039 1R FFFFFF85 2R 22222222 3R 33333333 <--- ブレーク・ポイントEXITPROC到達時のレジスター内容 4R 44444444 5R 55555555 6R 66666666 7R 77777777 8R 88888888 9R 99999999 10R AAAAAAAA 11R BBBBBBBB 12R 00023000 13R 000230CC 14R 00000005 15R 00000000 DATAAREA <--- ブレーク・ポイントEXITPROC到達時の +0 00000000 0000123D 00003039 FFFC9500 *..............n.* ラベルDATAAREAからWORKAREA間に定義された 1A85FF85 C1C1C2C3 C4C5C6C7 C84040E7 *.e.eAABCDEFGH X* データ領域のメモリー内容 +20 E8E7E8E7 E8F1F2F3 F4F54040 40000000 *YXYXY12345 ...* 01231234 5C000034 56789C87 5D00875D *....*......g).g)* +40 F0F0F0F1 F2F3F4C5 000230CC 02312CC1 *0001234E.......A* WORKAREA <--- ブレーク・ポイントEXITPROC到達時の +0 C1C2C3C4 C5C6C7C8 40400000 00000000 *ABCDEFGH ......* ラベルWORKAREA領域のメモリー内容(256バイト) 00000000 00000000 00000000 00000000 *................* +20 00000000 00000000 00000000 00000000 *................* ※この時点のレジスターとメモリーの内容が、 00000000 00000000 00000000 00000000 *................* ラベルMAINPROCからラベルEXITPROC間で実行 +40 00000000 00000000 00000000 00000000 *................* された一連の命令によって変更されたもの。 00000000 00000000 00000000 00000000 *................* +60 00000000 00000000 00000000 00000000 *................* 00000000 00000000 00000000 00000000 *................* +80 00000000 00000000 00000000 00000000 *................* 00000000 00000000 00000000 00000000 *................* +A0 00000000 00000000 00000000 00000000 *................* 00000000 00000000 00000000 00000000 *................* +C0 00000000 00000000 00000000 00000000 *................* 00000000 00000000 00000000 00000000 *................* +E0 00000000 00000000 00000000 00000000 *................* 00000000 00000000 00000000 00000000 *................* TEST GO <--- プログラムの実行再開を指示 IKJ57023I PROGRAM UNDER TEST HAS TERMINATED NORMALLY+ <--- 最後迄実行してプログラムは終了したことを示す IKJ57023I BREAKPOINTS SET ARE STILL VALID TEST END |
レジスターとメモリー内容の出力は2箇所で行われていますが、1つ目のものはラベルMAINPROCの箇所に到達した時点の内容です。プログラム冒頭の入口点処理を行い、渡されたパラメーター文字列の長さをレジスター0に、アドレスをレジスター1に格納した状態でここに到達します。2つ目のものがラベルMAINPROCからラベルEXITPROC迄の間に実行された一連の命令によって変更された最終の内容で、ラベルEXITPROC到達時の状態です。
途中で異常終了した場合は、TESTコマンドによって実行が打ち切られます。SYSTSPRT内容ではABENDしたことしかわからないので、ジョブ・ログに出ている徴候ダンプを見てABENDした命令とABEND時のレジスター内容を確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
READY TEST *(GO) 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' TEST AT MAINPROC (L 0R:15R;L 1R%-2 XC L(64)) TEST AT EXITPROC (L 0R:15R;L DATAAREA:WORKAREA XC;L WORKAREA XC L(256)) TEST GO IKJ57024I AT MAINPROC 0R 00000024 1R 00024F3E 2R FFFFFFFF 3R FFFFFFFF 4R FFFFFFFF 5R FFFFFFFF 6R FFFFFFFF 7R FFFFFFFF 8R FFFFFFFF 9R FFFFFFFF 10R FFFFFFFF 11R FFFFFFFF 12R 00025000 13R 000250CC 14R 007ADB6C 15R 00024F68 00024F3C. 0024C1C2 C3C4C5C6 C7C8C9D1 D2D3D4D5 *..ABCDEFGHIJKLMN* 00000000 D6D7D8D9 E2E3E4E5 E6E7E8E9 F0F1F2F3 *OPQRSTUVWXYZ0123* 00024F5C. F4F5F6F7 F8F90000 00000000 00000000 *456789..........* 00000000 000250CC 007ADB6C 00025000 *......&..:.%..&.* TEST GO IKJ56641I GO ENDED DUE TO ERROR <--- 実行途中でのエラー発生を示す IKJ56640I SYSTEM ABEND CODE 0C7 REASON CODE 00000000 <--- ABENDコード IKJ57025I PROGRAM UNDER TEST HAS TERMINATED + ※どの命令でABENDしたかはこれではわからないので IKJ57025I BREAKPOINTS ARE NO LONGER VALID ジョブログを見る。 J E S 2 J O B L O G -- S Y S T E M S 0 W 1 -- N O D E S V S C J E S 2 18.03.26 JOB04219 ---- TUESDAY, 05 MAR 2024 ---- 18.03.26 JOB04219 IRR010I USERID Zxxxxx IS ASSIGNED TO THIS JOB. 18.03.27 JOB04219 IEF677I WARNING MESSAGE(S) FOR JOB Zxxxxx@A ISSUED 18.03.27 JOB04219 ICH70001I Zxxxxx LAST ACCESS AT 17:56:35 ON TUESDAY, MARCH 5, 2024 18.03.27 JOB04219 $HASP373 Zxxxxx@A STARTED - INIT 4 - CLASS A - SYS S0W1 18.03.28 JOB04219 - -----TIMINGS (MINS.)------ 18.03.28 JOB04219 -STEPNAME PROCSTEP RC EXCP CONN TCB SRB CLOCK SERV WORKLOAD 18.03.28 JOB04219 -ASMACL C 00 94 16 .00 .00 .0 19 BATCH 18.03.28 JOB04219 -ASMACL L 00 45 7 .00 .00 .0 7 BATCH 18.03.28 JOB04219 IEA995I SYMPTOM DUMP OUTPUT 985 985 SYSTEM COMPLETION CODE=0C7 REASON CODE=00000000 985 TIME=18.03.28 SEQ=58916 CPU=0000 ASID=0034 985 PSW AT TIME OF ERROR 078D1000 000250A6 ILC 4 INTC 07 985 ACTIVE MODULE ADDRESS=00000000_00025000 OFFSET=000000A6 985 NAME=GO ~~~~~~~~ 985 DATA AT PSW 000250A0 - C12A4F10 C118D209 C167C12D プログラムの先頭からxA6番地の命令 985 AR/GR 0: 007FE7EC/00003039 1: 00000000/FFFFFF85 又は1つ前の命令がエラーを起こしている。 985 2: 00000000/22222222 3: 00000000/33333333 985 4: 00000000/44444444 5: 00000000/55555555 <--- ABEND時のレジスター内容 985 6: 00000000/66666666 7: 00000000/77777777 985 8: 00000000/88888888 9: 00000000/99999999 985 A: 00000000/AAAAAAAA B: 00000000/BBBBBBBB 985 C: 00000000/00025000 D: 00000000/000250CC 985 E: 00000000/007ADB6C F: 07000000/00024F68 985 END OF SYMPTOM DUMP 18.03.28 JOB04219 -G 00 113 16 .00 .00 .0 11 BATCH 18.03.28 JOB04219 -Zxxxxx@A ENDED. NAME-Zxxxxx TOTAL TCB CPU TIME= .00 TOTAL ELAPSED TIME= .0 18.03.28 JOB04219 $HASP395 Zxxxxx@A ENDED - RC=0000 |
徴候ダンプ内の「OFFSET=00000xxx」部分がABENDした命令の位置を示します。上記例のようにOFFSET=000000A6であれば、プログラムの先頭からxA6番地の命令かその1つ前の命令です。基本的にはオフセット値が示す命令の1つ前の命令ですが、OFFSET=の1つ前の行に出ている「ILC ? INTC ??」が「ILC 4 INTC 10」又は「ILC 4 INTC 11」ならオフセット値が示す命令でエラーが起きています。(命令の位置はアセンブリー・リスト左端のLocフィールドと照らし合わせます:下記リスト例参照)
何故エラーになりABENDしたかは、「SYSTEM COMPLETION CODE=xxx」が示すABENDコードをマニュアルで調べます。上記例ではS0C7でデータ例外(誤ったデータを指定して命令を実行した)です。
1 2 3 4 5 6 |
Loc Object Code Addr1 Addr2 Stmt Source Statement 00009E 4810 C12A 0012A 53 LH R1,HWORD2 LOAD HWORD2 0000A2 4F10 C118 00118 55 CVB R1,DWORD CONVERT IT TO PACKED-DECIMAL 0000A6 D209 C167 C12D 00167 0012D 57 MVC WORKAREA(10),CHAR2 MOVE CHAR2 TO WORKAREA 0000AC 1FEE 59 SLR R14,R14 CLEAR WORKREG 0000AE 41F0 0005 00005 60 LA R15,5 LOAD LOOP COUNT |
ステップ走行による命令動作の確認
プログラム終了時のレジスターとメモリーの内容ではなく、命令を実行しながら都度都度確認することもできます。ステップ走行と呼ばれ、1命令実行してはブレークします。TSOのTESTコマンドでは、ATサブコマンドによるブレーク・ポイントの設定を範囲で行うこともできます。ブレーク・ポイントが範囲設定された場合は、その範囲内の各命令実行毎にブレークします。ループする場合も1命令ずつブレークしながらループします。
4. ステップ走行を設定してひな型プログラムJCLを実行する
ステップ走行を行う場合は、「アセンブラー学習用のひな型プログラムJCL②」を使用します。(冒頭のJOBステートメント部分は、ひな型プログラムJCL①同様に修正して下さい)
下記のJCLは「アセンブラー学習用のひな型プログラムJCL②」の終盤部分です。ひな型プログラムJCL①同様に、2つ目のステップのSYSTSIN DDステートメントに、TSOのTESTコマンドを記述して実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
: :(ここ迄省略) : *---------------------------------------------------------------------* WORKAREA DS XL256 --- 256BYTES WORKING AREA --- *---------------------------------------------------------------------* YREGS , EXPAND GPR EQUATIONS(z/OS ONLY) END REPRO PAGE MAINPROG END //********************************************************************* //G EXEC PGM=IKJEFT01,COND=((8,LE,ASMACL.C),(8,LE,ASMACL.L)) //STEPLIB DD DISP=(OLD,DELETE),DSN=&&GOSET //SYSTSPRT DD SYSOUT=* //SYSTSIN DD * TEST *(GO) 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' AT MAINPROC:EXITPROC + (L 0R:15R;L DATAAREA:WORKAREA XC;L WORKAREA XC L(032);GO) GO // // // |
ひな型プログラムJCL①同様に、SYSTSIN内にTESTコマンドとサブコマンドを記述します。2行目でブレーク・ポイントの設定をMAINPROC:EXITPROCと範囲指定で行っています。プログラム内のラベルMAINPROCとEXECPROCの間の各命令にブレーク・ポイントが設定され、ブレーク時は命令毎にレジスター内容とDATAAREAとWORKAREA間及びWORKAREA領域の先頭32バイト分のメモリー内容が出力されて次の命令の実行に進みます。
ATサブコマンドの次、4行目のGOサブコマンドは、TESTコマンドによって読み込まれたプログラムの実行を開始するためのものです。ブレーク後の再開用GOサブコマンドは、ATサブコマンド内に記述してあります。バッチTSOでのステップ走行では、ATサブコマンド内に再開用のGOサブコマンドも定義しておかないと、実際に実行される命令数であるダイナミック・ステップ数に合わせたGOサブコマンドをSYSTSIN内に何十行以上も繰り返し定義する必要があります。プログラム処理の中でループがあるとループ回数なども考慮して実行される命令数を計算しなければならずとても面倒です。GOコマンドの数が実際に実行される命令数より少ない場合は、途中で実行が打ち切られてしまいます。
下記にサンプルのステップ走行実行結果(SYSTSPRT)を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
READY TEST *(GO) 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' TEST AT MAINPROC:EXITPROC (L 0R:15R;L DATAAREA:WORKAREA XC;L WORKAREA XC L(032);GO) TEST GO IKJ57024I AT MAINPROC 0R 00000024 1R 00022F3E 2R FFFFFFFF 3R FFFFFFFF 4R FFFFFFFF 5R FFFFFFFF 6R FFFFFFFF 7R FFFFFFFF 8R FFFFFFFF 9R FFFFFFFF 10R FFFFFFFF 11R FFFFFFFF 12R 00023000 13R 00023168 14R 00BAEB6C 15R 00022F68 DATAAREA 00000000 +0 00000000 00000000 00003039 FFFC9500 *..............n.* 1A85FF85 C1C1C2C3 C4C5C6C7 C84040E7 *.e.eAABCDEFGH X* +20 E8E7E8E7 E8F1F2F3 F4F54040 40000000 *YXYXY12345 ...* 01231234 5C000034 56789C87 5D00875D *....*......g).g)* +40 F0F0F0F1 F2F3F4C5 00023168 0231C400 *0001234E......D.* WORKAREA 00000000 +0 00000000 00000000 00000000 00000000 *................* 00000000 00000000 00000000 00000000 *................* IKJ57024I AT +4 FROM MAINPROC <--- 次に実行されるのがMAINPROC+4番地の命令であることを示す 0R 00000024 1R 00022F3E 2R 22222222 3R FFFFFFFF <--- 命令実行前のレジスター内容 4R FFFFFFFF 5R FFFFFFFF 6R FFFFFFFF 7R FFFFFFFF (命令実行後のレジスター内容は 8R FFFFFFFF 9R FFFFFFFF 10R FFFFFFFF 11R FFFFFFFF 次の命令の出力を見る) 12R 00023000 13R 00023168 14R 00BAEB6C 15R 00022F68 DATAAREA 00000000 +0 00000000 00000000 00003039 FFFC9500 *..............n.* <--- 命令実行前のメモリー内容 1A85FF85 C1C1C2C3 C4C5C6C7 C84040E7 *.e.eAABCDEFGH X* +20 E8E7E8E7 E8F1F2F3 F4F54040 40000000 *YXYXY12345 ...* 01231234 5C000034 56789C87 5D00875D *....*......g).g)* +40 F0F0F0F1 F2F3F4C5 00023168 0231C400 *0001234E......D.* WORKAREA 00000000 +0 00000000 00000000 00000000 00000000 *................* 00000000 00000000 00000000 00000000 *................* IKJ57024I AT +8 FROM MAINPROC <--- 次に実行されるのがMAINPROC+8番地の命令であることを示す 0R 00000024 1R 00022F3E 2R 22222222 3R 33333333 <--- 命令実行前のレジスター内容 4R FFFFFFFF 5R FFFFFFFF 6R FFFFFFFF 7R FFFFFFFF (命令実行後のレジスター内容は 8R FFFFFFFF 9R FFFFFFFF 10R FFFFFFFF 11R FFFFFFFF 次の命令の出力を見る) 12R 00023000 13R 00023168 14R 00BAEB6C 15R 00022F68 DATAAREA 00000000 +0 00000000 00000000 00003039 FFFC9500 *..............n.* <--- 命令実行前のメモリー内容 1A85FF85 C1C1C2C3 C4C5C6C7 C84040E7 *.e.eAABCDEFGH X* +20 E8E7E8E7 E8F1F2F3 F4F54040 40000000 *YXYXY12345 ...* 01231234 5C000034 56789C87 5D00875D *....*......g).g)* +40 F0F0F0F1 F2F3F4C5 00023168 0231C400 *0001234E......D.* WORKAREA 00000000 +0 00000000 00000000 00000000 00000000 *................* 00000000 00000000 00000000 00000000 *................* IKJ57024I AT +C FROM MAINPROC 0R 00000024 1R 00022F3E 2R 22222222 3R 33333333 4R 44444444 5R FFFFFFFF 6R FFFFFFFF 7R FFFFFFFF 8R FFFFFFFF 9R FFFFFFFF 10R FFFFFFFF 11R FFFFFFFF 12R 00023000 13R 00023168 14R 00BAEB6C 15R 00022F68 DATAAREA 00000000 +0 00000000 00000000 00003039 FFFC9500 *..............n.* 1A85FF85 C1C1C2C3 C4C5C6C7 C84040E7 *.e.eAABCDEFGH X* +20 E8E7E8E7 E8F1F2F3 F4F54040 40000000 *YXYXY12345 ...* 01231234 5C000034 56789C87 5D00875D *....*......g).g)* +40 F0F0F0F1 F2F3F4C5 00023168 0231C400 *0001234E......D.* WORKAREA 00000000 +0 00000000 00000000 00000000 00000000 *................* 00000000 00000000 00000000 00000000 *................* IKJ57024I AT +10 FROM MAINPROC 0R 00000024 1R 00022F3E 2R 22222222 3R 33333333 4R 44444444 5R 55555555 6R FFFFFFFF 7R FFFFFFFF 8R FFFFFFFF 9R FFFFFFFF 10R FFFFFFFF 11R FFFFFFFF 12R 00023000 13R 00023168 14R 00BAEB6C 15R 00022F68 DATAAREA 00000000 +0 00000000 00000000 00003039 FFFC9500 *..............n.* 1A85FF85 C1C1C2C3 C4C5C6C7 C84040E7 *.e.eAABCDEFGH X* +20 E8E7E8E7 E8F1F2F3 F4F54040 40000000 *YXYXY12345 ...* 01231234 5C000034 56789C87 5D00875D *....*......g).g)* +40 F0F0F0F1 F2F3F4C5 00023168 0231C400 *0001234E......D.* WORKAREA 00000000 +0 00000000 00000000 00000000 00000000 *................* 00000000 00000000 00000000 00000000 *................* : :(途中省略) : IKJ57024I AT +4C FROM MAINPROC <--- 次に実行されるのがMAINPROC+4C番地の命令であることを示す 0R 00003039 1R FFFFFF85 2R 22222222 3R 33333333 4R 44444444 5R 55555555 6R 66666666 7R 77777777 8R 88888888 9R 99999999 10R AAAAAAAA 11R BBBBBBBB 12R 00023000 13R 00023168 14R 00000003 15R 00000002 DATAAREA 00000000 +0 00000000 0000123D 00003039 FFFC9500 *..............n.* 1A85FF85 C1C1C2C3 C4C5C6C7 C84040E7 *.e.eAABCDEFGH X* +20 E8E7E8E7 E8F1F2F3 F4F54040 40000000 *YXYXY12345 ...* 01231234 5C000034 56789C87 5D00875D *....*......g).g)* +40 F0F0F0F1 F2F3F4C5 00023168 0231C4C1 *0001234E......DA* WORKAREA 00000000 +0 C1C2C3C4 C5C6C7C8 40400000 00000000 *ABCDEFGH ......* 00000000 00000000 00000000 00000000 *................* IKJ57024I AT +50 FROM MAINPROC <--- 次に実行されるのがMAINPROC+50番地の命令であることを示す 0R 00003039 1R FFFFFF85 2R 22222222 3R 33333333 4R 44444444 5R 55555555 6R 66666666 7R 77777777 8R 88888888 9R 99999999 10R AAAAAAAA 11R BBBBBBBB 12R 00023000 13R 00023168 14R 00000004 15R 00000002 DATAAREA 00000000 +0 00000000 0000123D 00003039 FFFC9500 *..............n.* 1A85FF85 C1C1C2C3 C4C5C6C7 C84040E7 *.e.eAABCDEFGH X* +20 E8E7E8E7 E8F1F2F3 F4F54040 40000000 *YXYXY12345 ...* 01231234 5C000034 56789C87 5D00875D *....*......g).g)* +40 F0F0F0F1 F2F3F4C5 00023168 0231C4C1 *0001234E......DA* WORKAREA 00000000 +0 C1C2C3C4 C5C6C7C8 40400000 00000000 *ABCDEFGH ......* 00000000 00000000 00000000 00000000 *................* IKJ57024I AT +4C FROM MAINPROC <--- ループしているので次に実行される命令アドレスが前に戻っている 0R 00003039 1R FFFFFF85 2R 22222222 3R 33333333 4R 44444444 5R 55555555 6R 66666666 7R 77777777 8R 88888888 9R 99999999 10R AAAAAAAA 11R BBBBBBBB 12R 00023000 13R 00023168 14R 00000004 15R 00000001 DATAAREA 00000000 +0 00000000 0000123D 00003039 FFFC9500 *..............n.* 1A85FF85 C1C1C2C3 C4C5C6C7 C84040E7 *.e.eAABCDEFGH X* +20 E8E7E8E7 E8F1F2F3 F4F54040 40000000 *YXYXY12345 ...* 01231234 5C000034 56789C87 5D00875D *....*......g).g)* +40 F0F0F0F1 F2F3F4C5 00023168 0231C4C1 *0001234E......DA* WORKAREA 00000000 +0 C1C2C3C4 C5C6C7C8 40400000 00000000 *ABCDEFGH ......* 00000000 00000000 00000000 00000000 *................* IKJ57024I AT +50 FROM MAINPROC 0R 00003039 1R FFFFFF85 2R 22222222 3R 33333333 4R 44444444 5R 55555555 6R 66666666 7R 77777777 8R 88888888 9R 99999999 10R AAAAAAAA 11R BBBBBBBB 12R 00023000 13R 00023168 14R 00000005 15R 00000001 DATAAREA 00000000 +0 00000000 0000123D 00003039 FFFC9500 *..............n.* 1A85FF85 C1C1C2C3 C4C5C6C7 C84040E7 *.e.eAABCDEFGH X* +20 E8E7E8E7 E8F1F2F3 F4F54040 40000000 *YXYXY12345 ...* 01231234 5C000034 56789C87 5D00875D *....*......g).g)* +40 F0F0F0F1 F2F3F4C5 00023168 0231C4C1 *0001234E......DA* WORKAREA 00000000 +0 C1C2C3C4 C5C6C7C8 40400000 00000000 *ABCDEFGH ......* 00000000 00000000 00000000 00000000 *................* IKJ57024I AT +54 FROM MAINPROC <--- ブレーク範囲の終了地点まで到達 0R 00003039 1R FFFFFF85 2R 22222222 3R 33333333 4R 44444444 5R 55555555 6R 66666666 7R 77777777 8R 88888888 9R 99999999 10R AAAAAAAA 11R BBBBBBBB 12R 00023000 13R 00023168 14R 00000005 15R 00000000 DATAAREA 00000000 +0 00000000 0000123D 00003039 FFFC9500 *..............n.* 1A85FF85 C1C1C2C3 C4C5C6C7 C84040E7 *.e.eAABCDEFGH X* +20 E8E7E8E7 E8F1F2F3 F4F54040 40000000 *YXYXY12345 ...* 01231234 5C000034 56789C87 5D00875D *....*......g).g)* +40 F0F0F0F1 F2F3F4C5 00023168 0231C4C1 *0001234E......DA* WORKAREA 00000000 +0 C1C2C3C4 C5C6C7C8 40400000 00000000 *ABCDEFGH ......* 00000000 00000000 00000000 00000000 *................* IKJ57023I PROGRAM UNDER TEST HAS TERMINATED NORMALLY+ <--- 最後迄実行してプログラムは終了したことを示す IKJ57023I BREAKPOINTS SET ARE STILL VALID TEST END |
次に実行される命令の位置は「IKJ57024I AT +50 FROM MAINPROC」のメッセージに変位が16進数で示されるので、先行したアセンブラーのステップで出力されたアセンブリー・リストと照らし合わせれば具体的にどの命令が実行されるかがわかります。ひな型プログラムJCL②では、命令位置を照らし合わせ易くするため、ラベルMAINPROCがプログラムの先頭から16進の100、x100番地になるように調整しています。「IKJ57024I AT +2C FROM MAINPROC」ならアセンブリー・リスト左端のLocが00012Cの命令、「IKJ57024I AT +40 FROM MAINPROC」ならアセンブリー・リスト左端のLocが000140の命令です。IKJ57024Iメッセージ中の16進変位の値にx100を足せば、アセンブリー・リスト左端のLocフィールドの値に換算できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Loc Object Code Addr1 Addr2 Stmt Source Statement 000100 38 MAINPROC DS 0H 000100 5820 C300 00300 39 L R2,=A(X'22222222') GR2 <--- X'22222222' 000104 5830 C304 00304 40 L R3,=A(X'33333333') GR3 <--- X'33333333' 000108 5840 C308 00308 41 L R4,=A(X'44444444') GR4 <--- X'44444444' 00010C 5850 C30C 0030C 42 L R5,=A(X'55555555') GR5 <--- X'55555555' 000110 5860 C310 00310 43 L R6,=A(X'66666666') GR6 <--- X'66666666' 000114 5870 C314 00314 44 L R7,=A(X'77777777') GR7 <--- X'77777777' 000118 5880 C318 00318 45 L R8,=A(X'88888888') GR8 <--- X'88888888' 00011C 5890 C31C 0031C 46 L R9,=A(X'99999999') GR9 <--- X'99999999' 000120 58A0 C320 00320 47 L R10,=A(X'AAAAAAAA') GR10 <-- X'AAAAAAAA' 000124 58B0 C324 00324 48 L R11,=A(X'BBBBBBBB') GR11 <-- X'BBBBBBBB' 000128 5800 C1B8 001B8 50 L R0,FWORD1 LOAD FWORD1 00012C 5000 C1B0 001B0 51 ST R0,DWORD STORE IT INTO DWORD 000130 4810 C1C0 001C0 52 LH R1,HWORD1 LOAD HWORD1 000134 5010 C1B4 001B4 53 ST R1,DWORD+4 STORE IT INTO DWORD+4 000138 4810 C1C2 001C2 55 LH R1,HWORD2 LOAD HWORD2 00013C 4E10 C1B0 001B0 56 CVD R1,DWORD CONVERT IT TO PACKED-DECIMAL 000140 D209 C1FF C1C5 001FF 001C5 58 MVC WORKAREA(10),CHAR2 MOVE CHAR2 TO WORKAREA 000146 1FEE 60 SLR R14,R14 CLEAR WORKREG 000148 41F0 0005 00005 61 LA R15,5 LOAD LOOP COUNT 00014C 62 LOOP DS 0H 00014C A7EA 0001 63 AHI R14,+1 INCREMENT R14 000150 46F0 C14C 0014C 64 BCT R15,LOOP DO UNTIL R15=0 65 *********************************************************************** 66 * *----------------------------------* 67 * * PROGRAM EXIT PROCEDURE * 68 * * ============================== * 69 * * GR15 --> COMPLETION CODE(RETCD * 70 * *----------------------------------* 000154 71 EXITPROC DS 0H EXIT PROCEDURE AT HERE |
ひな型プログラムJCLは汎用的なバッチ処理として作ってあるので、全ての命令実行に対して全汎用レジスターとDATAAREA~WORKAREA間及びWORKAREAの先頭32バイトのメモリー内容を固定した範囲で無条件に出力していますが、プログラムの実行内容に合わせて出力範囲を変えることも可能です。その場合JCLでの記述はかなり面倒なので、命令毎にレジスター番号や範囲、メモリー範囲を変えて内容を見たい場合はTSO端末からの対話型での実行が便利です。ただし、TESTコマンドはISPFのコマンド・シェルでは実行できないので、TESTコマンド起動用のREXXを作って実行するかISPFを終了させて実行しなければなりません。
TESTコマンドの使い方は、別記事として掲載しますので参考にしてみて下さい。より詳細はマニュアル「TSO/Eコマンド解説書」(SA88-7049)を参照して下さい。