[zz] 主机OS/390汇编程序入门篇

概述

主机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

参考资料

 

书名 链接 汇编语言编译软件使用手册 信息查阅手册 JCL 用户指南 JCL语言参考 ESA体系汇编指令参考大全(31位或者24位) Z体系汇编指令参考大全(64位、31位或者24位) MVS系统汇编调用指南
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

你可能感兴趣的:(编程)