/*--------------------------------------------------------------------+ | | | Copyright (c) 1995, SAS Institute Inc. | | Unpublished - All Rights Reserved | | | | | | S A S / C S A M P L E | | | | SampleName: ALOADMM | | | | Purpose: Demonstrate how to maintain a single C execution | | framework in a C and assembler application. Each | | primary module in the ALOADM sample will display | | the CRAB address it is using. | | | | If a single C framework has been properly created and | | maintained, the CRAB address displayed by each module | | should be exactly the same. | | | | There are three primary modules in this sample and | | a single C function used by each primary module to | | display the CRAB address. | | | | This sample has two independently executable | | parts, some code is common to both parts: | | | | Part 1: | | C main calling a statically linked assembler | | program using CENTRY(non-INDEP), and CEXIT. | | The assembler program then dynamically loads a | | C function compiled without INDEP. This C function | | is then called in a loop for several interations. | | When the loop is completed the assembler returns | | to the C main. | | | | Part #1 Information: See Below | | | | Part 2: | | An assembler program using CENTRY(w/INDEP), | | and CEXIT. The assembler program dynamically | | loads a C function compiled without INDEP. The | | assembler prgoram calls the dynamically loaded | | C function in a loop for several iterations. After | | the loop has completed the assembler program | | terminates the C execution framework and exits. | | | | Part #2 Information: | | - MVS see prefix.SAMPLE.ASM(ALOADMA) | | - CMS see SAMPLASM MACLIB(ALOADMA) | | | | The modules in this sample also demonstrate the | | following: | | - Calling a statically linked assembler program | | from a C main. | | - Using SAS/C functions loadm/unloadm to manage | | dynamic loadling/unloading of programs. | | - Use of CENTRY/CEXIT, both INDEP and non-INDEP. | | - Using CREGS and DSA extensions. | | - Calling SAS/C Library functions from assembler. | | - C runtime options specifed in source. | | - Using INLINE machine code to save the CRAB address. | | | | | |---------------------------------------------------------------------| | | | NOTE: The following Section Applies to Part # 1 ONLY! | | | |---------------------------------------------------------------------| | | | Name: ALOADMM | | | | Language: C | | | | EntryPoint: MAIN | | | | Entry Type: Standard OS Entry Linkage | | | | Files Note: 'prefix' is the installation defined high level | | qualifier for the SAS/C product. | | | | Function: The C main program displays the CRAB and then calls | | a statically linked assembler program. Upon return | | from the assembler, the C main displays the CRAB | | again. | | | | Case 1 modules: ALOADMM - C Main program statically linked with | | assembler program ALOADMA. | | ALOADMA - A non-INDEP assembler program using | | CENTRY/CEXIT which dynamically loads | | and executes non-INDEP ALOADMD. | | ALOADMD - A non-INDEP dynamically loadable | | C function. | | ALOADMC - A C function which is statically linked| | and used by the caller to display the | | CRAB address being used. | | | | MVS - | | Compile/Link/Go: submit jcl in prefix.SAMPLE.AUX(ALOADMJ) | | | | CMS - | | Compile/Link/Go: execute CMS exec in SAMPLAUX MACLIB(ALOADMEX) | | as: ALOADMEX | | Misc Notes: | | - Module ALOADM is assembler independent, use either | | Assembler H or High Level Assembler. | | | +--------------------------------------------------------------------*/ #include #include /* The following demonstrates how to specify runtime options in */ /* source. None are required for the proper operation of the */ /* ALOADM sample. */ extern int _options = _VERSION + _BTRACE + _USAGE + _WARNING; extern int crbc(void); extern int casm(void); int main() { printf("CMAIN : Entry\n"); printf("CMAIN : Entry Crab------>"); crbc(); printf("CMAIN : Assembler Call\n"); printf("\n>--C Main ---> Assembler -------------->\n\n"); casm(); printf("\n<-Assembler ---> C Main --------------<\n\n"); printf("CMAIN : Assembler Return \n"); printf("CMAIN : Exit Crab ------>"); crbc(); printf("CMAIN : Exit\n"); exit(0); }