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

參考資料

書名 鏈接
彙編語言編譯軟件使用手冊 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
 
發佈了16 篇原創文章 · 獲贊 1 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章