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