如何解决z/VSE上HLASM「Hello World」程序返回码120的问题?
z/VSE环境下HLASM程序返回码120的原因及修正方案
你的HLASM Hello World程序能正常输出内容,但结束时返回码120,核心原因是程序未按照z/VSE的规范完成系统返回流程:
z/VSE中返回码120通常表示程序异常终止,本质是你用BR 14直接返回时,没有设置表示正常结束的返回码寄存器(R15),系统默认识别为异常状态;同时,对于直接由作业流启动的程序,单纯的分支跳转没有触发操作系统的任务清理流程,导致返回码异常。
修正方法
有两种可行的修正方式:
方式1:设置正常返回码后再分支返回
在BR 14前添加LR 15,0,将寄存器15设置为0(z/VSE中0代表正常结束),让系统识别为正常终止:
HELLO CSECT STM 14,12,12(13) Save registers LR 12,15 Establish addressability USING HELLO,12 WTO 'HELLO, WORLD' Write to operator LM 14,12,12(13) Restore registers LR 15,0 设置正常返回码0 BR 14 Return END HELLO
方式2:使用RET宏完成系统返回
RET宏是z/VSE专门用于程序返回操作系统的指令,会自动处理返回码设置和任务清理,替代BR 14即可:
HELLO CSECT STM 14,12,12(13) Save registers LR 12,15 Establish addressability USING HELLO,12 WTO 'HELLO, WORLD' Write to operator LM 14,12,12(13) Restore registers RET 正确返回到操作系统 END HELLO
优化后的完整作业流
另外建议明确指定执行编译链接后的程序,修改作业流中的// EXEC为// EXEC HELLO,避免系统默认执行的潜在问题:
* $$ JOB JNM=CRASMHEL,DISP=D,CLASS=A,NTFY=YES * $$ LST DISP=D,CLASS=A,PRI=3 // JOB CRASMHEL COMPILE PROGRAM HELLO // ASSGN SYSLST,PRT1 // OPTION ERRS,SXREF,SYM,NODECK,LINK // EXEC ASMA90,SIZE=(ASMA90,64K),PARM='EXIT(LIBEXIT(EDECKXIT)),SIZE(MAXC-200K,ABOVE)' HELLO CSECT STM 14,12,12(13) Save registers LR 12,15 Establish addressability USING HELLO,12 WTO 'HELLO, WORLD' Write to operator LM 14,12,12(13) Restore registers LR 15,0 设置正常返回码0 BR 14 Return END HELLO /* // EXEC LNKEDT,SIZE=256K // EXEC HELLO /& * $$ EOJ
内容的提问来源于stack exchange,提问作者Leonid Tepliakov
相关产品推荐
相关产品推荐

