|
|
1.1 ! root 1: /* This example illustrates the use of the following 286DOS function: ! 2: * DOSCREATECSALIAS ! 3: * ! 4: * A data segment is allocated by calling DOSALLOCSEG. A small assembly ! 5: * language routine is created in this data segment. An alias code selector ! 6: * for this data segment is obtained by calling DOSCREATECSALIAS. Using the ! 7: * alias code selector, the routine in the data segment is called. After ! 8: * returning from the routine, the alias code selector and the data segment ! 9: * are freed by calling DOSFREESEG. ! 10: * ! 11: * This program illustrates the function - it does not do anything useful. ! 12: * A more likely use of aliasing code to data is where the code is actually ! 13: * generated at run time, rather than statically declared in this example. ! 14: * ! 15: * Copyright (C) Microsoft Corp. 1986 ! 16: */ ! 17: ! 18: #include <doscalls.h> /* CP/DOS function declarations */ ! 19: #include <stdio.h> /* printf C lib function declaration */ ! 20: #include <dos.h> /* FP_OFF and FP_SEG macros */ ! 21: ! 22: #define PRIVATE 0 /* segment will not be shared */ ! 23: #define SOMENUM 3 /*to be squared by proc in CSAlias'ed segment*/ ! 24: ! 25: unsigned char square[] = { /*a routine that computes the square of an integer*/ ! 26: 0x55, /* push bp */ ! 27: 0x8b, 0xec, /* mov bp,sp */ ! 28: 0x8b, 0x46, 0x06, /* mov ax,[bp+6] */ ! 29: 0xf7, 0xe0, /* mul ax */ ! 30: 0x8b, 0xe5, /* mov sp,bp */ ! 31: 0x5d, /* pop bp */ ! 32: 0xcb, /* retf */ ! 33: '\0' /* terminate with null */ ! 34: }; ! 35: ! 36: main () ! 37: { ! 38: unsigned DataSelector, /* selector to data segment */ ! 39: CodeSelector; /* alias code segment selector */ ! 40: char *DataSeg; /* pointer to data segemnet */ ! 41: long (*proc)(int); /* pointer to a procedure */ ! 42: long SquareOfInt; /* to hold square of an integer*/ ! 43: ! 44: /* allocate a segment */ ! 45: DOSALLOCSEG (sizeof(square), &DataSelector, PRIVATE); ! 46: ! 47: /* construct a far pointer to the data segment */ ! 48: FP_SEG(DataSeg) = DataSelector; ! 49: FP_OFF(DataSeg) = 0; ! 50: ! 51: /* copy an assembly language procedure into the data segment */ ! 52: strcpy(DataSeg, square); ! 53: ! 54: /* get a csalias selector for the data segment */ ! 55: DOSCREATECSALIAS (DataSelector, &CodeSelector); ! 56: ! 57: /* construct the address to the procedure in the csalias'ed segment */ ! 58: FP_SEG(proc) = CodeSelector; ! 59: FP_OFF(proc) = 0; ! 60: ! 61: /* execute the code in the csalias'ed data segment */ ! 62: if ((SquareOfInt = (*proc)(SOMENUM)) != (SOMENUM * SOMENUM)) ! 63: printf ("*** error: procedure in CSAlias'ed segment failed ***\n"); ! 64: ! 65: /* free the alias code selector */ ! 66: DOSFREESEG(CodeSelector); ! 67: ! 68: /* free the data segment */ ! 69: DOSFREESEG(DataSelector); ! 70: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.