Writing Your Own Standard __chkstk RoutineLast reviewed: July 17, 1997Article ID: Q70173 |
6.00 6.00a 7.00 | 6.00 6.00a | 1.00 1.50
MS-DOS | OS/2 | WINDOWSkbprg kbfasttip The information in this article applies to:
SUMMARYIt's possible to write your own stack checking routine. First, you must allocate some space on the stack and set up the STKHQQ data area. In addition, you must create a near and far version for each memory model. This requires two functions, __aNchkstk (near model) and __aFchkstk (far model), which should be included in every library if you want to override the default stack-checking routines. Finally, you must define the STKHQQ and __chkstk symbols in the default version for the memory model you are working with.
MORE INFORMATIONBelow is an example of the replacement code for a small model version of the __chkstk routines. Notice that STKHQQ and __chkstk are defined in the near model version. The STACKSLOP constant is 256 in MS-DOS and 512 under OS/2. To assemble the C 6.0 version define the symbol C600 by adding /DC600 assembler option. You can then either replace these modules in the small or compact libraries, or link with the .OBJs and the /NOE LINK option.
Sample Code;***** __aNchkstk function ***** ; Assembly options needed - MASM 6.0, 6.0a, 6.0b, and 6.1: /Zm /c /Cx ; MASM 5.1: /MX.MODEL SMALL IFDEF C600 EXTRN _end:word ELSE EXTRN __end:wordENDIF include cmacros.inc include msdos.inc .DATA IFDEF C600 PUBLIC STKHQQ STKHQQ dw dataoffset _end+STACKSLOP ELSE PUBLIC _STKHQQ _STKHQQ dw dataoffset __end+STACKSLOPENDIF .CODE PUBLIC __chkstk PUBLIC __aNchkstk __aNchkstk PROC __chkstk: pop cx ; grab the return address sub sp, ax jmp cx__aNchkstk ENDP END ;***** __aFchkstk function ***** ; Assembly options needed - MASM 6.0, 6.0a, 6.0b, and 6.1: /Zm /c /Cx ; MASM 5.1: /MX.MODEL LARGE .DATA IFDEF C600 extrn STKHQQ:word ELSE extrn _STKHQQ:wordENDIF .CODE _TEXT PUBLIC __aFchkstk __aFchkstk PROC
pop cx ; grab the return address pop dx ; (and its segment) sub sp, ax push dx ; push the return address push cx ret ; and go back to that address__aFchkstk ENDP END
|
Additional reference words: kbinf 6.00 6.00a 7.00 7.00b 1.00 1.50 chkstk
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |