home *** CD-ROM | disk | FTP | other *** search
/ CD Shareware Magazine 1997 January / CD_shareware_1-97.iso / DOS / PRG / STRUC.ZIP / STRUC_C.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1996-02-17  |  3.4 KB  |  124 lines

  1. // This code is best compiled using:
  2. //  bcc32 -WX -B -3 filename filename.asm
  3.  
  4. #include <iostream.h>
  5. #include <conio.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <dos.h>
  9.  
  10. // define a structure of various size elements.
  11. struct mystruct{
  12.   char              c;
  13.   unsigned char    uc;
  14.   short             s;
  15.   unsigned short   us;
  16.   long              l;
  17.   unsigned long    ul;
  18.   char string    [80];
  19.   };
  20.  
  21. // This will be a simple function for preformatting our screen.
  22. void format();
  23.  
  24. // The assembler  routine must  be  declared  as  "extern".  I'll use the
  25. //  "C" type calling convention,  since  I concider it much easier to not
  26. //  have  to  fiddle  with  the leading  underscores in code of this type.
  27. extern "C" void fill_struct (mystruct *);
  28. extern "C" unsigned long get_stack_pntr(void);
  29. extern "C" print_stack_value();
  30.  
  31. main()
  32. {
  33.    format();              
  34.  
  35.    char fill[45]=" + this portion added by the C++ module";
  36.    
  37.    static unsigned long stack_pntr;
  38.    long save_esp;
  39.  
  40. // Declare a pointer of a type to match my C++ structure.    
  41.     mystruct * struct_ptr;
  42.  
  43. // And create one object.    
  44.     mystruct struct_out;
  45.     
  46. // I'm going to go ahead and define all the members here.    
  47.     struct_out.c  = 0;
  48.     struct_out.uc = 0;
  49.     struct_out.s  = 0;
  50.     struct_out.us = 0;
  51.     struct_out.l  = 0;
  52.     struct_out.ul = 0;
  53.     for (int i = 0; i < 80; i++) struct_out.string[i] = '0';
  54.  
  55. // And assign the address of the copy of this structure that I'll be dealing
  56. //  with here to a pointer that I can pass around.
  57.     
  58.     struct_ptr = &struct_out;
  59.  
  60. // Go get the address of the assembler module's stack. I'll use it to pass    
  61. //  data to that stack in the inline .asm code below.
  62.     stack_pntr = get_stack_pntr();
  63.  
  64.     asm{
  65.       sub eax, eax
  66.       mov eax, 3
  67.       mov [save_esp], esp
  68.       mov edx, [stack_pntr]
  69.       mov esp, edx
  70.       push eax
  71.       mov esp, [save_esp]};
  72.  
  73. // Here is a call to the assembler procedure to print out the value that I   
  74. //  I just passed using the inline .asm code above.
  75.     
  76.     print_stack_value();
  77.  
  78. // Now I'm going to call the assembler function, passing it a pointer to the
  79. //  structure within this module.
  80.     
  81.     fill_struct (struct_ptr);
  82.  
  83. // The assembler module filled my array with material. I'll add to that here.   
  84.    
  85.    strcat(struct_out.string, fill);
  86.  
  87. // These  are  the  screen  printing  routines.  They look a bit sloppy here,    
  88. //  but  I  wasn't  sure  how  to  keep this source any more tidy, and still
  89. //  deal with line wrap when others view this code.
  90.     
  91.     
  92.     cout << "\nThe values below are those passed to the \"C\" structure\n"
  93.             "from within the assembler routine.\n\n";
  94.     
  95.     cout << "char          : " << (int)struct_out.c << "        to " 
  96.          << -((int)struct_out.c) << "  ascii character ' ~ '" << endl
  97.          
  98.          << "unsigned char : " << (int)struct_out.uc << endl
  99.          
  100.          << "short         : " << struct_out.s << "      to " 
  101.          << -struct_out.s << endl 
  102.          
  103.          << "unsigned short: " << struct_out.us  << endl
  104.          
  105.          << "long          : " << struct_out.l << " to " << -struct_out.l 
  106.          << endl 
  107.          
  108.          << "unsigned long : " << struct_out.ul << endl;
  109.          cout << struct_out.string << endl ;
  110.   
  111.   getch ();
  112.   clrscr();
  113.   return 0;
  114. }
  115.  
  116. void format()
  117. {
  118.    clrscr();
  119.    for(int a = 0; a < 8; a++) cout << endl;
  120. }
  121.  
  122.  
  123.  
  124.