sstxutil.asm
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:4k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. page 49,132
  2. TITLE sstxutil - scanner text table management utilities
  3. ;***
  4. ;sstxutil.asm - scanner text table management utilities
  5. ;
  6. ; Copyright <C> 1986, Microsoft Corporation
  7. ;
  8. ;Purpose:
  9. ; The scanner behaves as a filter, reading pcode in one state
  10. ; and emiting it in another.  The SS_EXECUTE state is larger than
  11. ; either of the other two states, as coercion, opBranch and
  12. ; procedure invocation support executors are present in SS_EXECUTE
  13. ; mode only.
  14. ;
  15. ; At the beginning of scan, the text table is moved up in memory.
  16. ; It is then scanned to a point starting at the beginning of the segment.
  17. ;
  18. ; When the text expands, a test is made to ensure that there is still
  19. ; space between the source side of the filter and the emit side.  If
  20. ; room is tight, then the unscanned pcode is moved farther up within
  21. ; the segment.
  22. ;
  23. ; Links through the pcode are updated when they are scanned, not when
  24. ; the text moves.  For each link list in the text there is a control
  25. ; structure that maintains information about that link list.  See the
  26. ; LNK structure.
  27. ;
  28. ;
  29. ;****************************************************************************
  30. .xlist
  31. include version.inc
  32. SSTXUTIL_ASM = ON
  33. IncludeOnce scanner
  34. IncludeOnce ssint
  35. IncludeOnce txtmgr
  36. .list
  37. assumes DS, DATA
  38. assumes es, NOTHING
  39. assumes ss, DATA
  40. sBegin SCAN
  41. assumes cs, SCAN
  42. subttl
  43. page
  44. ;***
  45. ;SsEnsureGap
  46. ;Purpose:
  47. ; Ensure a gap between the scanner emit side and the source side.
  48. ;
  49. ; This routine updates the LNK link control structures used to
  50. ; maintain link lists through the text during scan.  The actual link
  51. ; lists are maintained when the pcodes containg the links are updated.
  52. ;
  53. ; The text is only actually moved if one of the two conditions is met:
  54. ; 1. The movement would be more than SS_oTxMovThreshold.
  55. ; 2. The movement is required to ensure the minimum gap of SS_oTxGapMin.
  56. ;
  57. ; When an allocation fails, it is retried with SS_cbTxAllocInc.  OME
  58. ; is detected by noting when the allocation size drops below the 
  59. ; allocation required to maintain the minimum gap between source and
  60. ; emit side in the scanner - SS_cbTxGapMin.
  61. ;
  62. ;
  63. ; Gap control constants are:
  64. ; SS_oTxMovThreshold - moves below this aren't made unless necessary
  65. ;   to maintain SS_cbTxGapMin.
  66. ; SS_cbTxAllocInc - amount by which a request is decremented
  67. ;   before retrying.
  68. ; SS_cbTxGapMin - minimum required gap size
  69. ;
  70. ; Variable SscbTxExpand is maintained as the total bytes of text
  71. ; expansion.
  72. ;
  73. ;Input:
  74. ; si =  oTxSrc      - first byte to move
  75. ; di = oTxEmit     - last byte emited by scanner + 1
  76. ; cx = cbTxGapPref - preferred gap size (SsMakeGap only)
  77. ;Output:
  78. ; si = new address of low byte of source side
  79. ; carry flag set if OME    
  80. ;
  81. ;**********************************************************************
  82. SS_cbTxMovThreshold = 64 ;cb of minimum move
  83. SS_cbTxAllocInc = 128 ;Decrement by this amount when allocation fails
  84. SS_cbTxGapMin = 20 ;At least 20 bytes between source and emit
  85. SsMakeGap:
  86. public SsMakeGap
  87. xor ax,ax ;No current gap
  88. and cl,0FEH ;Always move whole words
  89. cmp cx,SS_cbTxMovThreshold ;Request more than minimum?
  90. jb MinMove
  91. jmp short FigMove
  92. SsEnsureGap:
  93. public ssEnsureGap
  94. mov ax,si
  95. sub ax,di ;ax = cb Current gap
  96. cmp ax,SS_cbTxGapMin ;Is it big enough now?
  97. jae EnsureGapOK ;Yes - exit
  98. MinMove:
  99. mov cx,SS_cbTxMovThreshold ;Minimum move to try
  100. FigMove:
  101. mov dx,SS_cbTxGapMin ;Absolute minimum allowed gap
  102. sub dx,ax ;dx = min move to get to required gap
  103. EnsureAllocLoop:
  104. ; cx = cbMovMax (getting smaller each loop)
  105. ; dx = cbMovMin
  106. push cx ;Save cbMovMax
  107. push dx ;  and cbMovMin
  108. Arg si ;pFirst byte of pcode to move
  109. Arg cx ;cbMove
  110. cCall TxtMoveUpFar ; Attempt to move the text
  111. GETSEGTXTCUR ;es = the text segment
  112. pop dx
  113. pop cx
  114. or ax,ax ;Test for success
  115. jnz EnsureGapGrew ;Movment succeded - exit
  116. cmp cx,dx ;Trying minimum move?
  117. jz EnsureGapOME
  118. sub cx,SS_cbTxAllocInc ;Decrement for retry
  119. cmp cx,dx ;Less than minimum?
  120. jge EnsureAllocLoop ;Retry if more than minimum
  121. mov cx,dx ;Try absolute minimum
  122. jmp EnsureAllocLoop ; and retry
  123. EnsureGapOME:
  124. stc ;Signal OME
  125. ret
  126. EnsureGapGrew:
  127. add SscbTxExpand,cx ;Update total bytes of movement
  128. add si,cx
  129. EnsureGapOK:
  130. clc
  131. ret
  132. sEnd SCAN
  133. end