/*--------------------------------------------------------------------+ | | | Copyright 1995 (c), SAS Institute Inc. | | Unpublished - All Rights Reserved | | | | S A S / C S A M P L E | | | | Name: C2ASMC | | | | Language: C | | | | EntryPoint: MAIN | | | | EntryType : OS Entry Linkage | | | | Files Note: 'prefix' is the installation defined high level | | qualifier for the SAS/C product. | | | | Function: Call a statically linked assembler routine which | | sums a list of integers passed as pointers to int | | in the call. Two calls are made by C2ASMC, one with | | two arguments and the second with four arguments. | | | | The sum is checked after each call to SUMINT to | | ensure the result is as expected. | | | | Purpose: Demonstrate a C function calling a statically linked | | assembler routine expecting a C framework. C2ASMC | | uses the & operator to generate the pointers to | | int for the parameter list. The facilities of | | __asm are used to produce the VL-type parameter | | list which is required by SUMINT. | | | | MVS - Compile/Link/Go: submit prefix.SAMPLE.AUX(C2ASMJ) | | | | CMS - | | Source: SAMPLASM MACLIB (C2ASMC/C2ASMA) | | | | Assemble: global maclib lcuser | | hlasm c2asma | | | | Compile: global maclib lc370 | | lc370 c2asmc | | | | Load: global txtlib lc370bas lc370std | | load c2asmc c2asma (nomap reset main rmode 24 amode 24 | | | | Genmod: genmod c2asmc( from @main | | | | Execute: c2asmc | | | | Notes: | | | +--------------------------------------------------------------------*/ #include #include #include /* Function Declaration for the assembler routine */ extern __asm int sumint(int *, ...);/* Note: */ /* 1) __asm keyword will build */ /* a VL-type parameter list.*/ /* If the last argument is */ /* a pointer, the high order*/ /* bit of byte 0 will be set*/ /* on. SUMINT expects all */ /* arguments to be pointers */ /* to int. */ /* */ /* 2) Usage of the ellipsis */ /* to indicate a variable */ /* length paramenter list */ /* should be expected. */ /* The following demonstrates how to specify runtime options in */ /* in source code. They are not required for the proper execution */ /* of the C2ASM sample. */ extern int _options = _VERSION + _BTRACE + _USAGE + _WARNING; int main () { int h = 1; int i = 2; int j = 3; int k = 4; int sum = 0; /* Returned value */ int check_sum; /* Check variable */ int retcode = 0; /*---------------------------------------------------------------*/ /* First Time with 2 argument pointers to int */ /*---------------------------------------------------------------*/ sum = sumint(&h, &i); /* Note: Args passed by reference. */ printf("\n\nVariable Length with 2 arguments, " "the sum of %d and %d is %d\n", h, i, sum); check_sum = h+i; if (sum == check_sum) /* Verify Sum is corrrect.*/ { printf("\nSum of %d was correct.\n", sum); retcode = 0; } else { printf("\nSum of %d was NOT CORRECT!.\n", sum); printf("It should have been %d!\n",check_sum); retcode = 12; }; /*---------------------------------------------------------------*/ /* Second Time with 4 argument pointers to int */ /*---------------------------------------------------------------*/ sum = sumint(&h, &i, &j, &k); /* Note: Args passed by reference. */ printf("\n\nVariable Length with 4 arguments, " "the sum of %d, %d, %d and %d is %d\n", h, i, j, k, sum); check_sum = h+i+j+k; if (sum == check_sum) /* Verify Sum is correct.*/ {printf("\nSum of %d was correct.\n", sum);} else { printf("\nSum of %d was NOT CORRECT!\n.", sum); printf("It should have been %d!\n",check_sum); retcode = 12; }; exit(retcode); }