here goes - the c program (cotasm.c) was also copied from a post (i
think Crista's) and added the main section.
i thought i knew a little C from studying Microsoft's c# for Windows,
but when i look at c, c++ on the mainframe I know next to nothing - c#
is completely different. That is why i got interested in this topic.
actually, i get the same type of abend (segmentation violation) trying
to run some of the jni examples i have found (using c and java),
although some do work and others abend. and the abends happen when
running both batch and under OMVS. i have not yet looked up what the
segmentation violation abend means.
ctoasm.c
int OBTAIN(unsigned long[]);
#pragma linkage(OBTAIN, OS)
#pragma pack(1) /* 1 byte alignment */
typedef struct
{
char Ds1FmtId;
char Ds1Dssn[6];
unsigned short Ds1VolSq;
char Ds1CreDt[3];
char Ds1ExpDt[3];
unsigned char Ds1NoEpv;
unsigned char Ds1NoBdb;
unsigned char Ds1Flag1;
char Ds1SysCd[13];
char Ds1RefDt[3];
unsigned char Ds1SmsFg;
unsigned char Ds1ScXft;
unsigned short Ds1ScXtv;
unsigned char Ds1DsOrg[2];
unsigned char Ds1RecFm;
unsigned char Ds1OptCd;
unsigned short Ds1BlkL;
unsigned short Ds1LrecL;
unsigned char Ds1KeyL;
unsigned short Ds1Rkp;
unsigned char Ds1DsInd;
unsigned char Ds1ScAl1;
unsigned char Ds1ScAl3[3];
unsigned char Ds1LstAr[3];
unsigned short Ds1TrBal;
unsigned char Reserved;
unsigned char Ds1Tthi;
unsigned char Ds1Ext1[10];
unsigned char Ds1Ext2[10];
unsigned char Ds1Ext3[10];
unsigned char Ds1PtrDs[5];
char Filler[44];
} DSCB;
#pragma pack() /* default alignment */
int call_obtain(char *Dsn, char *VolSer) {
int Rc;
unsigned long Parm[4];
char ParmDsn[44];
char ParmVolSer[6];
DSCB Dscb;
memset(ParmDsn, ' ', 44);
memcpy(ParmDsn, Dsn, strlen(Dsn));
memset(ParmVolSer, ' ', 6);
memcpy(ParmVolSer, VolSer, strlen(VolSer)); /*should be 6 always!*/
Parm[0] = 0xC1000000;
Parm[1] = (unsigned long) ParmDsn;
Parm[2] = (unsigned long) ParmVolSer;
Parm[3] = (unsigned long) &Dscb;
if((Rc = OBTAIN(&Parm[0])) != 0)
return(Rc);
/* do something with DSCB */
return(0);
}
int main()
{
char dsname[44], volume[6];
memset(&dsname,' ',44);
,Command ===>,
memcpy(&dsname, "XCICS.EILEEN.PDSE", 17);
memset(&volume,' ', 6);
memcpy(&volume, "CICH92", 6);
memset(&work,' ',140);
call_obtain(dsname,volume,work);
}
**assembler program obtasm.s
********************************* Top of Data *************
*
R0 EQU 0
R1 EQU 1
R2 EQU 2
R3 EQU 3
R4 EQU 4 PARMS
R5 EQU 5
R6 EQU 6
R7 EQU 7
R8 EQU 8
R9 EQU 9
R10 EQU 10
R11 EQU 11 BASE
R12 EQU 12 LE/370 COMMON ANCHOR AREA (CAA)
R13 EQU 13 LE/370 DYNAMIC SAVE AREA (DSA)
R14 EQU 14
R15 EQU 15
*
PARM DSECT
PARM_FLG DS F FUNCTION-CODE HEX'C1000000'
PARM_DSN DS F ADDR OF DSN (44 BYTES)
PARM_VOL DS F ADDR OF VOLSER (6 BYTES)
PARM_WRK DS F ADDR OF 140 BYTE WORK/RETURN-AREA
*
*
OBTAIN CEEENTRY PPA=MAINPPA, ADDR OF PROGRAM PROLOG AREA X
AUTO=WORKSIZE, SIZE OF DSECT (-> SAVEAREA!)
XX
NAB=NO, NAB NOT USED
XX
MAIN=NO, NO MAINPROG
XX
EXPORT=NO, DONT EXPORT ENTRYPOINT
XX
BASE=R11 BASE
*
USING CEECAA,R12 COMMON ANCHOR AREA
USING CEEDSA,R13 DSA + LOCAL (DYNAM.) VARIABLES
*----------------------------------------------------------------------
,Command ===>, ,Scroll ==
L R4,0(R1) LOAD ADDR OF PARMS
USING PARM,R4 ADDRESS PARMS
*
OBTAIN PARM INVOKE OBTAIN
ST R15,RETCODE SAVE RC
*
CEETERM RC=RETCODE
*----------------------------------------------------------------------
MAINPPA CEEPPA PROGRAM PROLOG AREA
LTORG
*----------------------------------------------------------------------
CEEDSA DSECT: DYNAMIC SAVE AREA
RETCODE DS F RETURNCODE
DS 0D ENSURE ALIGNMENT!!!
WORKSIZE EQU *-CEEDSA
*----------------------------------------------------------------------
CEECAA DSECT: COMMON ANCHOR AREA
CEEEDB DSECT: ENCLAVE DATA BLOCK
END
to compile: (get no errors)
c++ -v -o ctoasm ctoasm.c obtasm.s
when run:
$ ctoasm
CEE3204S The system detected a protection exception (System Completion
Code=0C4)
.
From compile unit OBTAIN at entry point OBTAIN at compile unit
offset +
00000086 at entry offset +00000086 at
address 18BEA116.
<> LEAID ENTERED (LEVEL 04/01/2008 AT 12.32)
<> LEAID PROCESSING COMPLETE. RC=0
[1] + Done(139) ctoasm
83886348 Segmentation violation ./ctoasm
$
-----Original Message-----
From: IBM Mainframe Discussion List [mailto:[email protected]] On
Behalf Of Michael Knigge
Sent: Thursday, May 14, 2009 4:47 PM
To: [email protected]
Subject: Re: C/C++ Calling OBTAIN / IGC0002G
Barkow, Eileen schrieb:
> i tried to use the assembler code given in a previous post and got
about
> the same 0c4 abend i got using OBTAIN in c.
> can you give me a copy of the assembler code that worked.
The code posted is the code that works.
Give use your code (asm + c) and your compiler+asm+link options and I'll
compare them with mine... maybe we can see what is going wrong....
Bye,
Michael
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: GET IBM-MAIN INFO
Search the archives at http://bama.ua.edu/archives/ibm-main.html
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: GET IBM-MAIN INFO
Search the archives at http://bama.ua.edu/archives/ibm-main.html