The STRING Macro Instruction for VSE/ESA & z/VSE

                 

The STRING assembler macro instruction was developed in the late 1980s on MVS/XA using the Assembler H, and started to be distributed on the CBT Tape in 1992. STRING can be used in VSE/ESA and z/VSE using the High-Level Assembler; it is described on this page.

Note: When the %TIME operand is specified, STRING internally uses the TIME macro, which is available on all MVS systems, and also on VSE/ESA 2.4 and above. On older VSE systems, the TIME macro is not available and %TIME should not be used.

The source of the STRING macro instruction is available here.

An MVS sample program can also be found below. It is more complex than the sample VSE program.

Sample VSE Program

This is a very simple VSE program that uses the STRING macro. Its JCL is MVS JCL because this program was written, assembled and executed in MVS using VSE-ON-MVS libraries. VSE users need to convert the JCL to assemble and execute this program in VSE, provided, of course, the source code of the STRING macro has been installed on the VSE system.

//HLASM EXEC PGM=ASMA90,PARM=(OBJECT,NODECK,NOESD,NORLD,NOXREF)
**********************************************************************
**********************************************************************
******** VSE TEST PROGRAM FOR THE 'STRING' MACRO - HLASM ONLY ********
**********************************************************************
**********************************************************************
         BALR  R7,0 
         USING *,R7 
         COMRG REG=(R8)                  COM-REG 
         USING COMREG,R8 
**         LA    R9,COMREND-1              Last byte of COM-REG 
**         PDUMP (R8),(R9)                 Print COMREG in hex 
         PACK  JDATE,YYDDD               PACK Julian Date 
*
         OPEN  SYSLST                    OPEN Print File
         STRING '1Title Line -',40X,'Page ',(KPAGE,P,R4Z),             X
               INTO=PRTLINE 
         PUT   SYSLST                    Write title line 
*
         STRING ' JOBNAME=',(COMNAME,,L), JOB NAME w/o trail spaces    X
               ' COM-REG=',((R8),,X),    COM-REG addr                  X
               ' YYDDD=',YYDDD,          Julian Date                   X
               ' YYYY-MM-DD=',(JDATE,P,YYYY-MM-DD),                    X
               ' HH:MM:SS.hhh=',%TIME,   Current Time                  X
               INTO=PRTLINE 
         PUT   SYSLST                    Write PRTLINE 
*
         STRING 1X,INTO=PRTLINE          Blank line 
         PUT   SYSLST                    Write PRTLINE
*
         CLOSE SYSLST                    CLOSE Print File
         EOJ   RC=1                      EOJ
*
SYSLST   DTFPR DEVADDR=SYSLST,IOAREA1=PRTLINE,CTLCHR=ASA 
KPAGE    DC    P'0001'                   Page counter 
JDATE    DS    P'99365'                  Packed Julian Date 
PRTLINE  DS    CL121                     Print Line
         STRING GENERATE                 Generate @STRING Routine
         MAPCOMR                         COM-REG MAP 
         IPW$EQU                         R0-RF 
R14      EQU   RE                        STRING needs R14 
         END 
//SYSLIB   DD DSN=GSFSOFT.VSEONMVS.MACLIB,DISP=SHR
// DD DSN=CBTTAPE.FILE183.PDS(STRING),DISP=SHR
// DD DSN=SYS1.MACLIB(DCB),DISP=SHR
//SYSUT1   DD UNIT=VIO,SPACE=(CYL,1)
//SYSPRINT DD SYSOUT=*
//SYSLIN   DD DSN=&&SYSLIN,DISP=(NEW,PASS),UNIT=VIO,BLKSIZE=3200
//* 
//GO      EXEC PGM=LOADER,PARM=NOPRINT
//STEPLIB  DD DSN=GSFSOFT.VSEONMVS.LOAD,DISP=SHR
//SYSLIN   DD DSN=&&SYSLIN,DISP=(OLD,DELETE)
//SYSLST   DD SYSOUT=*
//SYSUDUMP DD SYSOUT=* 

MVS Sample Program

This is an MVS program that is used to test most features of the STRING macro. This is not a simple program and not a VSE program, sorry !

**********************************************************************  11580000
**********************************************************************  11590000
******** MVS TEST PROGRAM FOR THE 'STRING' MACRO - HLASM ONLY ********  11600017
**********************************************************************  11610000
**********************************************************************  11620000
TESTPGM  START X'027000'                                                11700002
TESTPGM  AMODE 24                      (PRE-SMS PUT)                    11710008
         BALR  R12,0                                                    11720000
         USING *,R12                                                    11730000
         OPEN  (SYSPRINT,OUTPUT)                                        11800000
         STRING 'Assembler is &SYSVER, DATE is &SYSDATC',INTO=XXX       11810007
         PUT   SYSPRINT,XXX                                             11820007
         STRING 'AMPERSAND=&& AND APOSTROPHE='' ',INTO=XXX              11830014
         PUT   SYSPRINT,XXX                                             11840014
*
RBPREFIX EQU   *                                                        11850002
RBINTCOD EQU   *+6,2,C'H'              ?                                11860002
         L     R1,PSATOLD-PSA(0,0)     TCB                              11870008
         L     R1,0(,R1)               TCBRBP                           11880002
         L     R2,PSAAOLD-PSA(0,0)     ASCB                             11890014
R2ASCB   USING ASCB,R2                                                  11900014
         L     R8,=X'88888888'                                          11902017  
         STRING 'SVC',(RBINTCOD-RBPREFIX(R1),H,R3Z),                   X11910002
               1X,(WWWW,,T),' - ',     VV.MM OF SVC RTNE               X11920002
               ' COM-REG=',((R8),,X),    COM-REG ADDR                  X11930008 
               'ASID=',(R2ASCB.ASCBASID,,X),1X,                        X11940014
               PARM1,1X,               MAIN PGM NAME                   X11950002
               INTO=XXX                                                 11960002
         PUT   SYSPRINT,XXX                                             11970002
*
         LA    R2,XXX                                                   11990002
         STRING 1X,INTO=((R2),8)                                        12000002
*
         MACRO                                       JDATE MACRO        12010000
        @JDATE &DATE                                 JDATE MACRO        12020000
         LA    R1,=P'&DATE'                          JDATE MACRO        12030000
*** STRING ((R1),P),2X,((R1),P),INTO=XXX                                12040000
         STRING ((R1),P,R5Z),                        JDATE MACRO       X12050000
               2X,((R1),P,YYMMDD),                   JDATE MACRO       X12060000
               2X,((R1),P,YY/MM/DD),                 JDATE MACRO       X12070000
               2X,((R1),P,DD/MM/YY),                 JDATE MACRO       X12080000
               2X,((R1),P,MM/DD/YY),                 JDATE MACRO       X12090000
               2X,((R1),P,YYYYMMDD),                 JDATE MACRO       X12100000
               2X,((R1),P,YYYY-MM-DD),               JDATE MACRO       X12110000
               INTO=XXX                              JDATE MACRO        12120000
         PUT   SYSPRINT,XXX                          JDATE MACRO        12130000
         MEND                                        JDATE MACRO        12140000
*
        @JDATE 90058                                                    12150000
        @JDATE 91059                                                    12160000
        @JDATE 93060                                                    12170000
        @JDATE 94365                                                    12180000
        @JDATE 80058                                                    12190000
        @JDATE 84059                                                    12200000
        @JDATE 88060                                                    12210000
        @JDATE 92061                                                    12220000
        @JDATE 00366                                                    12230000
         LA    R2,1234                                                  12240000
         STRING 'CVTPTR=X''',(CVTPTR,4,X),'''',INTO=XXX,               X12250000
               ' 1234=',((R2),,R4Z)                                     12260000
         PUT   SYSPRINT,XXX                                             12270000
         L     R1,CVTPTR(0,0)                                           12280008
         STRING 'CVTDATE=',(56(R1),P,YYMMDD),INTO=XXX                   12290000
         PUT   SYSPRINT,XXX                                             12300000
         LA    R0,1000                                                  12310000
         LA    R3,0033                                                  12320000
         STRING 'D1=/',D1,'/,WWWW=/',WWWW,'/',                         X12330000
               ((R3),,L),'/',((R3),,X),'/',((R0),,L),'/',              X12340000
               ((R3),,R9B),'/',INTO=XXX                                 12350000
         LR    R4,R15                   LENGTH USED                     12360000
         PUT   SYSPRINT,XXX                                             12370000
         STRING WWWW,                                                  X12380000
               (4(R13),4,X),'''',(4(R13),F),'''',                      X12390000
               (4(R13),F,L),'''',                                      X12400000
               (4(R13),F,L11),'''',                                    X12410000
               (4(R13),F,Z9),'''',                                     X12420000
               8X,'R4=',((R4),,L),      LENGTH USED                    X12430000
               INTO=XXX                                                 12440000
         PUT   SYSPRINT,XXX                                             12450000
*
         STRING %TIME,D1,'B12345678B',5X,(CTR1,P),1X,PARM1,1X,PARM2,   X12460000
               INTO=XXX                                                 12470000
         PUT   SYSPRINT,XXX                                             12480000
         LA    R3,17                                                    12490000
         STRING INTO=XXX,'CCC1234A',(D1,(R3)),'.',(CTR1,P,R7Z)          12500000
         PUT   SYSPRINT,XXX                                             12510000
         STRING C'DDN2(',(D1,,T),')',X'40C1C2,C3C4',                   +12520009
               ' PSATOLD=',(PSATOLD-PSA,,X),                           +12530000
               INTO=XXX                                                 12540000
         PUT   SYSPRINT,XXX                                             12550000
         AIF   ('&SYSVER' EQ 'ASMH').HLASM99                            12560007
PSABASE  USING PSA,R0                                                   12570000
         STRING 'PSATOLD=',(PSABASE.PSATOLD,,X),                       +12580000
               ' PSATOLD=',(PSATOLD-PSA,,X),                           +12590000
               INTO=XXX                                                 12600000
         PUT   SYSPRINT,XXX                                             12610000
.HLASM99 ANOP                                                           12620000
         BALR  R0,0                                                     12630000
         STRING 'R0=',((R0),,X),'   16(R0)=',(16(R0),4,X),INTO=XXX      12640000
         PUT   SYSPRINT,XXX                                             12650000
         STRING 'R0=',((R0),,X),'   CTR1=',(CTR1,P,R5B),INTO=XXX        12660012
         PUT   SYSPRINT,XXX                                             12670012
         SLR   R0,R0                                                    12680012
         STRING 'R0=',((R0),,X),'   CTR2=',(CTR2,P,L),'.',INTO=XXX      12690015
         PUT   SYSPRINT,XXX                                             12700012
*                                                                       12710016
         CALL  TCSECT2              <- 2nd CSECT                        12720016
*                                                                       12730016
         CALL  TCSECT3              <- 3rd CSECT                        12740016
*                                                                       12750002
AMODE31  LA    R12,0(,R12)             BALR->BASR                       12760002
         L     R15,=A(*+X'80000006')   AMODE=31                         12770002
         BSM   0,R15                   AMODE=31                         12780002
         L     R1,=A(@STRING)          point at CSECT                   12790007
         CLC   =C'/390',11(R1)         (GENERATE,AR_MODE) ?             12800007
         BNE   EXIT                    no, prevent S0E0                 12810007
         DSPSERV CREATE,                                               X12820002
               NAME==CL8'STRING00',    C'STRING00'                     X12830002
               BLOCKS=HDRBLKS,         SIZE IN PAGES                   X12840002
               STOKEN=DSPCSTKN,                                        X12850002
               ORIGIN=DSPCORG                                           12860002
         ALESERV ADD,STOKEN=DSPCSTKN,ALET=DSPCALET                      12870002
         LAM   R8,R8,DSPCALET          POINT TO THE DATA SPACE          12880002
         L     R8,DSPCORG              SPACE ORIGIN (0 OR 4096)         12890002
         SAC   512                     MODE=AR                          12900002
 LAM R14,R6,TESTPGM+40                 S0E0-28                          12910003
         STRING WWWW,'AR_MODE WORKED OK',INTO=(2048(R8),100)            12920007
         LAM   R2,R2,DSPCALET          POINT TO THE DATA SPACE          12930007
         LR    R2,R8                   SPACE ORIGIN (0 OR 4096)         12940007
         STRING (2048+L'WWWW(R2),30,T),INTO=XXX                         12950007
         SAC   0                       MODE=AR OFF                      12960007
         PUT   SYSPRINT,XXX            AR_MODE WORKS OK                 12970007
*                                                                       12980002
EXIT     SLR   R15,R15                                                  12990007
         SVC   3                       GOBACK                           13000002
*
*        STRING is used in other CSECTs
*
TCSECT2  CSECT                                                          13020016
         BAKR  R14,0                                                    13030016
         LR    R10,R15                                                  13040016
         USING TCSECT2,R10                                              13050016
         STRING '----> TCSECT2 STRING <----  R516',INTO=XXX             13060016
         PUT   SYSPRINT,XXX                                             13070016
         L     R1,CVTPTR(0,0)                                           13080016
         STRING 'CVTDATE=',(56(R1),4,X),',R8=',((R8),,L),INTO=XXX       13090016
         PUT   SYSPRINT,XXX                                             13100016
         PR                                                             13110016
         DROP                                                           13120017
*                                                                       13130016
         CSECT                           no-name                        13140016
         ENTRY TCSECT3                                                  13150016
TCSECT3  BAKR  R14,0                                                    13160016
         LR    R12,R15                                                  13170017
         USING TCSECT3,R12                                              13180017
         L     R10,PRT3ADDR                                             13190017
         USING SYSPRINT,R10                                             13200017
         STRING '----> TCSECT3 STRING <----  R517',INTO=XXX             13210017
         PUT   SYSPRINT,XXX                                             13220017
         L     R1,CVTPTR(0,0)                                           13230016
         STRING 'CVTDATE=',(56(R1),4,X),',R9=',((R9),,L),INTO=XXX       13240017
         PUT   SYSPRINT,XXX                                             13250017
         PR                                                             13260016
         DS    0F                                                       13270017
PRT3ADDR DC    A(SYSPRINT)                                              13280017
*
*        Data Areas
*
TESTPGM  CSECT                                                          13300016
D1       DC    C'D1-----D1    '                                         13310000
WWWW     DC    C'WWWW'                                                  13320000
CTR1     DC    P'1'                                                     13330000
CTR2     DC    P'-33'                                                   13340015
PARM1    DC    C'<-PARM1->'                                             13350000
PARM2    DC    C'<-PARM2->'                                             13360000
DSPCSTKN DS    XL8                  0  AS TOKEN                         13370002
DSPCALET DS    F                    8  ALET                             13380002
DSPCORG  DS    F                   12  ORIGIN                           13390002
HDRBLKS  DC    F'100'                                                   13400002
CVTPTR   EQU   0016,4,C'A'                                              13410000
SYSPRINT DCB   DSORG=PS,DDNAME=SYSPRINT,MACRF=PM,RECFM=FB,LRECL=121     13420000
XXX      DS    CL121                                                    13430017
*
*        Generate STRING code - check several options
*
XYZ      DSECT                                                          13450000
         STRING GENERATE                                                13460007
**       STRING (GENERATE,NO_CSECT) -\                                  13470007
**       STRING (GENERATE,AR_MODE)  -/                                  13480007
**       STRING (GENERATE,,LOCTR)                                       13490007
**       STRING (GENERATE,AR_MODE,LOCTR)                                13500007
**       STRING (GENERATE,NO_CSECT,LOCTR)    invalid combination        13510007
         YREGS                                                          13520000
*
PSA      DSECT                                                          13530000
PSATOLD  EQU   *+X'21C',4,C'A'                                          13540000
PSAAOLD  EQU   *+X'224',4,C'A'                                          13550014
ASCB     DSECT                                                          13560014
ASCBASID EQU   *+36,2,C'X'                                              13570014
         END                                                            13580000