Loading...
Select Version
&pagelevel(4)&pagelevel
Es soll die folgende Funktion in Assembler implementiert werden:
XSUBSTRING[2/3](STRING = <string_ausdruck>
,START = <arithm_ausdruck>
,LENGTH = <arithm_ausdruck> / *REST-LENGTH
)
Assembler-Schnittstelle
Titel der Funktion: |
|
Entry: |
|
Eingabedaten: |
|
Ausgabedaten: |
|
Erster Schritt : Syntaxbeschreibung
BIFDESC NAME='XSUBSTRING2', -
ENTRYN=(*CSECT,XSUBDEF2), -
PARLIST= -
((STRING,*STRING), -
(START,*INTEGER,1), -
(LENGTH,*INTEGER,*REST-LENGTH, -
(*REST-LENGTH)) -
), -
PARFORM=BY-VALUE,
VALTYPE=*STRING
END
Zweiter Schritt: Ausführungsprogramm
XSUBEX2 CSECT
XSUBEX2 AMODE ANY
XSUBEX2 RMODE ANY
STM 14,12,12(13) Speichere die Register des Aufrufers
BASR 10,0 R10: Basisregister
USING *,10
USING DSMDL1,4
USING DSMDL2,5
*
L 1,0(0,1) R1 › a(p1) ?? R1=a(p1)
*
LA 5,48(1) R5 › fünftes Element der Operandenliste
(z.B. RC)
L 5,4(5) R5 › RC
MVC 0(9,5),OKRC Set RC = OK
*
LA 4,0(1) bei R4 beginnt Operandenliste
L 6,BIF1VLG R6: Länge des Operanden STRING
L 7,BIF1VPT R7: Adresse des Operanden STRING
LTR 6,6 Ist die Länge von STRING=0?
BE MSGNULL Sende eine Meldung NILL_STRING
*
LA 4,12(1) bei R4 folgt zweites Element der
Operandenliste (z.B. START)
LA 2,1(0,0) R2 = 1
L 8,BIF1VPT R8: Adresse des Werts START
L 8,0(8) R8: Wert von START
CR 8,2 Wenn START < 1
BL MSGBOUN Sende Meldung OUT_OF_BOUNDS
CR 8,6 Wenn START > Länge von STRING
BH MSGBOUN Sende Meldung OUT_OF_BOUNDS
*
LA 4,24(1) bei R4 folgt drittes Element der
Operandenliste (z.B. LENGTH)
* R3 = Länge von STRING - START + 1
LA 3,1(0,0) R3 = 1
AR 3,6 R3 = R3 + Länge von STRING
SR 3,8 R3 = R3 - START
CLI BIF1VTY,BIF1INT
BE LENINT
LENKEYW DS OH
* *REST-LENGHT ist gesucht
LR 9,3
B @0001
LENINT DS OH
* LENGTH = *INTEGER
L 9,BIFTVPT R9: Adresse des Werts LENGHT
L 9,0(9) R9: Wert von LENGTH
CR 9,2 Wenn LENGTH < 1
BL MSGBOUN Sende Meldung OUT_OF_BOUNDS
CR 9,3 Wenn LENGTH < REST-LENGTH
BNH @0001 Dann ok
LR 9,3 LENGTH abgeschnitten
MVC 0(9,5),TRUNCRC Setze RC = TRUNCATED
@0001 DS OH
Berechne den Funktionswert
LA 4,36(1) bei R4 folgt viertes Element der
Operandenliste (z.B. FUNCTION_VALUE)
L 6,BIF1VPT R6 : Funktionwertadresse
AR 8,7 R8 = Adresse von STRING + START
SR 8,2 R8 = R8-1
LR 7,9 R7 = Länge des Funktionswerts
ST 7,BIF1VLG
MVCL 6,8 Kopiere in Funktionswert
B RETURN
*
MSGNULL MSG7X MF=E,PARAM=NULLPL
MVC 0(9,5),NULLRC Setze RC = NULL_STRING
B RETURN
*
MSGBOUN MSG7X MF=E,PARAM=BOUNDPL Setze RC = OUT OF BOUNDS
MVC 0(9,5),BOUNDRC
*
RETURN LM 14,12,12(13) Register (Aufrufer) zurückschreiben
BR 14 Zurück zum Aufrufer
OKRC DC XL1'00'
DC XL1'00'
DC CL7'CMD0001'
TRUNCRC DC XL1'02'
DC XL1'00'
DC CL7'SDP0414'
BOUNDRC DC XL1'00'
DC XL1'01'
DC CL7'SDP0412'
NULLRC DC XL1'00'
DC XL1'01'
DC CL7'SDP0411'
DS OF
NULLPL MSG7X MF=L,ID=SDP0411
BOUNDPL MSG7X MF=L,ID=SDP0412
DS OF
DSMDL1 BIFMDL1 MF=D
DS OF
DSMDL2 BIFMDL2 MF=D
END
Dritter Schritt: BIFTAB aktualisieren
BIFTAB CSECT
.....
XSUBSTR2 BIFDEF MF=L,NAME=XSUBSTRING2,SYNTAX=XSUBDEF2,CODE=XSUBEX2
.....
END