主机OS390汇编程序入门篇

    技术2022-05-11  70

    概述

    主机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 JCL 用户指南MVS JCL Users Guide JCL语言参考MVS JCL Reference ESA体系汇编指令参考大全(31位或者24位)ESA/390 Principles of Operations Z体系汇编指令参考大全(64位、31位或者24位)z/Architecture Principles of Operations MVS系统汇编调用指南MVS Assembler Services Guide  


    最新回复(0)