home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / FORTRAN / DISK5 / RCHKSTK.AS$ / RCHKSTK.bin
Text File  |  1990-03-02  |  4KB  |  172 lines

  1.     page    ,132
  2.     title    rchkstk - C stack checking routine (saves registers)
  3. ;***
  4. ;rchkstk.asm - C stack checking routine (saves registers)
  5. ;
  6. ;    Copyright (c) 1988-1990 Microsoft Corporation, All Rights Reserved
  7. ;
  8. ;Purpose:
  9. ;    Provides support for automatic stack checking in C procedures
  10. ;    when stack checking is enabled.  The check stack routines built
  11. ;    by this module save ALL registers across call (except CX).
  12. ;    This routine is used when the user specifies the -Gr
  13. ;    or _fastcall option.
  14. ;
  15. ;*******************************************************************************
  16.  
  17. .xlist
  18. ?PLM=0
  19. ?WIN=0
  20.  
  21. ;
  22. ; Determine which version of chkstk we're building
  23. ;
  24. ifdef  MI_NEAR
  25.     memS    equ     1            ; near version
  26.     _rchkstk equ    <_aNrchkstk>
  27. elseifdef MI_FAR
  28.     memM    equ     1            ; far version
  29.     _rchkstk equ    <_aFrchkstk>
  30. else
  31.   %OUT *** ERROR:  No model specified ****
  32.   .ERR
  33. endif
  34.  
  35. include cmacros.inc
  36. include msdos.inc
  37.  
  38. .list
  39.  
  40.     externNP _amsg_exit    ; write error and die
  41.  
  42.  
  43.  
  44. sBegin    data
  45. assumes ds,data
  46.  
  47.     extrn    STKHQQ:word    ; stack limit
  48.  
  49. if    sizeC
  50.     externCP _aaltstkovr    ; alternate stack overflow
  51. endif
  52.  
  53. sEnd    data
  54.  
  55.  
  56. sBegin    code
  57. assumes ds,data
  58. assumes cs,code
  59.  
  60. page
  61. ;***
  62. ;_rchkstk - check stack upon procedure entry (saves registers)
  63. ;
  64. ;Purpose:
  65. ;    Provides support for automatic stack checking in C procedures
  66. ;    when stack checking is enabled.  The check stack routines built
  67. ;    by this module save ALL registers across call (except CX).
  68. ;    This routine is used when the user specifies the -Gr
  69. ;    or _fastcall option.
  70. ;
  71. ;    [LLIBCDLL.LIB NOTE: Unlike other LLIBCDLL routines, DS != DGROUP
  72. ;    when chkstk() is called.]
  73. ;
  74. ;Entry:
  75. ;    CX = size of local frame
  76. ;
  77. ;Exit:
  78. ;    SP = new stackframe if successful
  79. ;
  80. ;Uses:
  81. ;    *** Preserves all registers except CX ***
  82. ;
  83. ;Exceptions:
  84. ;    Gives out of memory error and aborts if there is not enough
  85. ;    stack space for the routine.
  86. ;
  87. ;*******************************************************************************
  88.  
  89.  
  90. % labelP  <PUBLIC,_rchkstk>
  91.  
  92. ;
  93. ; --- Calculate the new SP ---
  94. ;
  95.  
  96.     push    si        ; save si/di around calculation
  97.     push    di
  98.  
  99.     mov    di,sp        ; di = sp
  100.     sub    di,cx        ; di = new position
  101.     jc    stack_err    ; error - out of stack
  102.  
  103.  
  104.  
  105.  
  106.     cmp    di,[STKHQQ]    ; new position ok ?
  107.     jb    stack_err    ; nope - out of stack
  108.  
  109.  
  110.  
  111.  
  112. ;
  113. ; --- New SP value is ok ---
  114. ; Move the return values down to where the new SP will be, restore bx,
  115. ; and return.  [NOTE: Be careful to always keep SP at the bottom of the
  116. ; stack in case an interrupt occurs during this sequence.]
  117. ;
  118. ; di = new SP
  119. ;
  120.  
  121.     mov    si,sp        ; si = old sp
  122.     mov    sp,di        ; sp = final value
  123.     jcxz    done        ; no moves needed if 0 temps
  124.  
  125.     mov    cx,ss        ; es = ss
  126.     mov    es,cx
  127.  
  128.     movs   word ptr es:[di],word ptr ss:[si] ; move saved di
  129.     movs   word ptr es:[di],word ptr ss:[si] ; move saved si
  130.     movs   word ptr es:[di],word ptr ss:[si] ; move saved return off
  131. if sizeC
  132.     movs   word ptr es:[di],word ptr ss:[si] ; move saved return seg
  133. endif
  134.  
  135.  
  136. done:
  137.     pop    di        ; restore di/si
  138.     pop    si
  139. if sizeC
  140.     retf            ; far return to caller
  141. else
  142.     retn            ; near return to caller
  143. endif
  144.  
  145.  
  146. ;
  147. ; --- ERROR: Stack overflow ---
  148. ;
  149.  
  150.  
  151. stack_err:
  152.  
  153. if    sizeC
  154.     pop    di        ; make return on top of stack
  155.     pop    si
  156.     mov    ax,word ptr [_aaltstkovr]
  157.     inc    ax        ; alt stack overflow handler defined ??
  158.     jnz    altstkovr    ; jump, if so
  159. endif
  160.  
  161.     xor    ax,ax        ; ax = _RT_STACK = 0
  162.     jmp    _amsg_exit    ; give stack overflow and die
  163.  
  164. if    sizeC
  165. altstkovr:
  166.     jmp    [_aaltstkovr]    ; Pascal/FORTRAN stack overflow
  167. endif
  168.  
  169. sEnd    code
  170.  
  171.     end
  172.