home *** CD-ROM | disk | FTP | other *** search
/ Computer Select (Limited Edition) / Computer Select.iso / dobbs / v16n09 / add_ext.asc next >
Encoding:
Text File  |  1991-08-21  |  1.9 KB  |  86 lines

  1. _ADDING AN EXTENSION LANGUAGE TO YOUR SOFTWARE_
  2. by Neville Franks
  3.  
  4.  
  5. Figurσ 2:
  6.  
  7. (a) sp = bp - size of stack frame;
  8.     bp = sp[ stack frame link ];
  9.     es = sp[ expression stack ];
  10.     ip = sp[ return address ];
  11.     sp = sp - sp[ argument count ];
  12.     
  13.  
  14.  
  15. (b) sp[ return address ] = ip;
  16.     sp[ stack frame link ] = bp;
  17.     sp[ expression stack ] = es;
  18.     sp[ argument count ] = arg_count;
  19.     sp = sp + size of stack frame;
  20.     bp = es = sp;
  21.     ip = function address;
  22.  
  23.  
  24.  
  25.  
  26.  
  27. Figurσ 4:
  28.  
  29.  
  30.     switch( ip->instruction )
  31.     {
  32.         case LODI :       /* load immediate -> ++sp */
  33.             *++sp = ip->immed_val;
  34.             ++ip;
  35.             break;
  36.  
  37.         case STOR :      /* store sp -> local variable */
  38.             *(bp + ip->addr) = *sp;
  39.             ++ip;
  40.             break;
  41.                 
  42.         case OPR_ADD :   /* add values on stack */
  43.             --sp;
  44.             *sp += *( sp + 1 );
  45.             ++ip;
  46.             break;
  47.  
  48.         case JPT :       /* conditional jump - true */
  49.             if ( *sp == 0 )
  50.             {
  51.                 ++ip;    /* next instr */
  52.                 break;
  53.             }   /* note: fall through */
  54.                 
  55.         case JMP :      /* unconditional jump */
  56.             ip = ip->addr; 
  57.             break;
  58.  
  59.         case ....
  60.     }
  61.  
  62.  
  63.  
  64. Figurσ 6:
  65.  
  66. (a)
  67.     add_up_numbers()
  68.     {
  69.     void *parms[4];
  70.     int result;
  71.  
  72.         parms[0] = &result;  /* result passed by reference */
  73.             /* numbers passed by value */
  74.         parms[1] = 23;  parms[2] = 69; parms[3] = -78;
  75.         pgm_run( "add_num", 4, parms ); 
  76.         printf( "Result = %d", result );
  77.     }
  78.  
  79.  
  80. (b)
  81.     main( result, num1, num2, num3 )
  82.     int *result, num1, num2, num3;
  83.     {
  84.         *result = num1 + num2 + num3;
  85.     }
  86.