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 ProgramThis 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 ProgramThis 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 |