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

Reply via email to