概述
主机OS/390 汇编程序曾经风靡一时。它曾应用于很多商业应用系统,特别是联机应用系统。随着高级语言的普及,以及计算机硬件资源的成本日趋下降,汇编语言不再是人们开发的首选,但是汇编语言还是有它的优点,现在仍然有着它用武之处。汇编语言适合于下面的几个方面:
1、任务需要很快的执行速度,例如驱动程序,ASCII to EBCDIC 转换程序,EXIT程序等。
2、需要利用系统底层接口,例如JES2 Exits,和MVS的大部分接口。
3、一些MVS系统只提供汇编语言接口,例如TCP/IP NPF Exit.
4、一些应用系统只提供汇编语言接口,例如用户的一些已有的系统的开发和维护的等。
此文的目的在于展现给大家如何在OS/390系统上开发一个简单的汇编程序。此文也适应于MVS系统和Z/OS 系统。
第一步、建立自己的库文件
首先你需要建立自己的文件库,下面的文件库是一般必须的:
1、汇编语言源文件库
2、JCL文件库
3、执行文件库
若想知道如何建立自己的这些文件,请参阅我的大作:
新手入门:如何在OS/390中建立自己的新文件
第二步、编写汇编程序”HELLO”
这是一个巨简单的汇编程序,显示“HELLO, THE WORLD!”.
按照下面步骤编辑该程序:
1、在ISPF中,输入=2, 进入Edit Entry Panel
2、输入你的源文件名称和HELLO, 如下所示:
3、进入ISPF Edit Panel, 如下所示。
4、输入HELLO源程序。有关ISPF EDIT 的用法,请参照HELP(键入F1). 你也可以从这里拷过去(Copy/Paste)。 另外,建议使用HILITE ON命令使得程序易读。该命令同样适用于所有Mainframe的高级语言。
下面是这个HELLO的源程序:
HELLO TITLE 'ASSEMBLER DEMONSTRATION PROGRAM.' ********************************************************************* * PROGRAM: HELLO. * * PURPOSE: DEMONSTATION ASSEMBLER PROGRAM * * DESIGN : HUNTER * * DATE : APRIL, 2005 * * DESCRIPTION: * * 1. COMPILE. * * USE FOLLOWING SAMPLE JCL TO COMPILE THE PROGRAM * * * * //JOBCARD ... * * //COMPILE EXEC ASMACL * * //C.SYSIN DD DISP=SHR,DSN=HUNTER.ASM.SOURCE(HELLO) <--CHANGE * * //C.SYSLIB DD DISP=SHR,DSN=SYS1.MACLIB * * // DD DISP=SHR,DSN=SYS1.MODGEN * * //L.SYSLMOD DD DISP=SHR,DSN=HUNTER.ASM.LOADLIB <--CHANGE * * //L.SYSIN DD * * * NAME HELLO(R) * * /* * * * * 2. RUN * * THE PROGRAM NEEDS SYSPRINT DD TO SHOW THE MESSAGE. * * * * //JOBCARD ... * * //HELLO EXEC PGM=HELLO * * //STEPLIB DD DISP=SHR,DSN=HUNTER.ASM.LOADLIB * * //SYSPRINT DD SYSOUT=* * * * * 3. SAMPLE OUTPUT * * THE SAMPLE OUTPUT WILL BE: * * HELLO, THE WORLD! * * * ********************************************************************* HELLO CSECT * DEFINE REGISTER EQUALS USING IBM STANDARD MACRO YREGS * YREGS * BUILD UP BASE REGISTERS FOR THE PROGRAM * USING HELLO,R15 ;R15 IS CURRENT ADDRESS, USING IT SAVE (14,12) ;SAVE CALLER'S REGISTERS USING SAVE LR R12,R15 ;COPY THE CURRENT CSECT LOCATION DROP R15 ;DROP THE TEMPORARY USING USING HELLO,R12 ;USE R12 AS BASE REG FROM NOW ON * BUILD LINKAGE OF THIS PROGRAM AND THE CALLER. ST R13,SAVEAREA+4 ;SET OUR BACKWARD LINK IN OUR SAVE LA R15,SAVEAREA ;LOAD ADDR OF OUR SAVEAREA TO R15 ST R15,8(R13) ;SET CALLER(MYSELF)'S FORWARD LINK LR R13,R15 ;LOAD OUR SAVEAREA ADDR TO R13. * MAIN PROGRAM BEGINS HERE OPEN (SYSPRINT,(OUTPUT)) ;OPEN THE SYSPRINT FILE. PUT SYSPRINT,HELLOMSG ;WRITE THE MESSAGE CLOSE SYSPRINT ;CLOSE SYSPRINT FILE * RETURN LINKAGE TO THE CALLER L R13,4(R13) ;LOAD ADDR OF CALLER'S SAVEAREA RETURN (14,12),RC=0 ;RESTORE CALLER'S REGS AND RETURN * STATIC STORAGE AREA SAVEAREA DS 18F ;REGISTER SAVE AREA HELLOMSG DC CL133' HELLO, THE WORLD!' SYSPRINT DCB DSORG=PS,MACRF=PM,DDNAME=SYSPRINT,RECFM=FBA,LRECL=133 END HELLO
第三步、编译汇编程序”HELLO”
在你的JCL库中,建立下面的JCL member HELLOCPL, 下面是编辑JCL步骤:
1、在ISPF中,输入=2, 进入Edit Entry Panel
2、输入你的JCL库文件和HELLOCPL。
3、进入ISPF Edit Panel。
4、输入JCL语句。有关ISPF EDIT 的用法,请参照HELP(键入F1). 你也可以从这里拷过去(Copy/Paste)。
使用下面的JCL HELLOCPL 来编译这个程序:
//youridCP JOB (),YOUR.NAME,MSGCLASS=H,MSGLEVEL=(1,1), // CLASS=A,NOTIFY=&SYSUID //*************************************************************** //COMPILE EXEC ASMACL //C.SYSIN DD DISP=SHR,DSN=HUNTER.ASM.SOURCE(HELLO) ? CHANGE!! //C.SYSLIB DD DISP=SHR,DSN=SYS1.MACLIB // DD DISP=SHR,DSN=SYS1.MODGEN //L.SYSLMOD DD DISP=SHR,DSN=HUNTER.ASM.LOADLIB ? CHANGE!! //L.SYSIN DD * NAME HELLO(R) /*
下面是如何察看编译结果:
1、使用=S;H到SDSF的HOLD Queue中。
2、使用命令PREFIX yourid* 显示所有输出。
3、使用命令SORT CRDATE D 显示最近的输出在开头。
4、在作业youridCP的行命令处输入?
5、在DDNAME SYSPRINT行命令处输入S, 你将看到编译的输出。假若有错误信息,使用命令F ASMA和F5键来查看错误信息。
第四步、运行汇编程序”HELLO”
在你的JCL库中,建立下面的JCL member HELLOCPL, 下面是编辑JCL:
1、SPF中,输入=2, 进入Edit Entry Panel
2、输入你的JCL库文件和HELLORUN。
3、进入ISPF Edit Panel。
4、输入JCL语句。有关ISPF EDIT 的用法,请参照HELP(键入F1). 你也可以从这里拷过去(Copy/Paste)。
使用下面的JCL HELLORUN运行这个程序:
//youridRN JOB (),YOUR.NAME,MSGCLASS=H,MSGLEVEL=(1,1), // CLASS=A,NOTIFY=&SYSUID //HELLO EXEC PGM=HELLO //STEPLIB DD DISP=SHR,DSN=HUNTER.ASM.LOADLIB <-- CHANGE!! //SYSPRINT DD SYSOUT=*
该程序的执行结果将在该程序的执行结果将保存在SYSPRINT DD中。下面是如何察看执行结果:
1、使用=S;H到SDSF的HOLD Queue中。
2、使用命令PREFIX yourid* 显示所有输出。
3、使用命令SORT CRDATE D 显示最近的输出在开头。
4、在作业youridRN的行命令处输入?
5、在DDNAME SYSPRINT行命令处输入S,你将看到下面的程序输出: HELL, THE WORLD!
调试汇编程序
在程序编译出问题时,可以到编译的SYSPRINT 输出中,查找ASMA关键字,来查看有关错误信息。错误信息可以到下面网站查找到解释: HLASM Users Guide
当程序运行出错时,使用以下方法:
1、程序ABEND,在程序输出中找到ABEND Code 和Reason, 然后到下面网站查找: MVS System Codes
2、使用SYSPRINT 输出,将向查看的数据输出到SYSPRINT DD中。
3、使用WTO信息。该方法适合于测试程序运行的逻辑路径,例如测试程序是否执行到了此处。下面的一段程序在HELLO中加入两个WTO信息:
WTO 'SHOW HELLO MESSAGE.' ;SHOW DEBUG MESSAGE OPEN (SYSPRINT,(OUTPUT)) ;OPEN THE SYSPRINT FILE PUT SYSPRINT,HELLOMSG ;WRITE THE MESSAGE CLOSE SYSPRINT ;CLOSE SYSPRINT FILE WTO 'END OF HELLO MESSAGE.' ;SHOW DEBUG MESSAGE
参考资料
High Level Assembler for MVS |
MVS Message and Codes |
MVS JCL Users Guide |
MVS JCL Reference |
ESA/390 Principles of Operations |
z/Architecture Principles of Operations |
MVS Assembler Services Guide |