ptr_cmp.asm
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. ; Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2. ; This library is free software; you can redistribute it and/or
  3. ; modify it under the terms of the GNU Library General Public
  4. ; License as published by the Free Software Foundation; either
  5. ; version 2 of the License, or (at your option) any later version.
  6. ; This library is distributed in the hope that it will be useful,
  7. ; but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  9. ; Library General Public License for more details.
  10. ; You should have received a copy of the GNU Library General Public
  11. ; License along with this library; if not, write to the Free
  12. ; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  13. ; MA 02111-1307, USA
  14. TITLE   Optimized cmp of pointer to strings of unsigned chars
  15. ifndef M_I386
  16. .8087
  17. DOSSEG
  18. .MODEL LARGE
  19. .DATA
  20. compare_length dw 0
  21. .CODE STRINGS
  22. PUBLIC _get_ptr_compare
  23. _get_ptr_compare PROC
  24. mov bx,sp
  25. mov cx,ss:[BX+4]
  26. mov compare_length,cx
  27. mov dx,seg strings:_ptr_cmp
  28. mov ax,offset _ptr_cmp_0
  29. jcxz @F
  30. mov ax,offset _ptr_cmp_1
  31. dec cx
  32. jz @F
  33. mov ax,offset _ptr_cmp
  34. @@: ret
  35. _get_ptr_compare ENDP
  36. _ptr_cmp_0 PROC
  37. mov AX,0 ; Emptyt strings are always equal
  38. ret
  39. _ptr_cmp_0 ENDP
  40. _ptr_cmp_1 PROC
  41. mov bx,sp
  42. mov dx,si ; Save si and ds
  43. mov cx,ds
  44. lds si,DWORD PTR ss:[bx+4] ; s1
  45. lds si,DWORD PTR ds:[si]
  46. mov al,ds:[si]
  47. xor ah,ah
  48. lds si,DWORD PTR ss:[bx+8] ; s2
  49. lds si,DWORD PTR ds:[si]
  50. mov bl,ds:[si]
  51. mov bh,ah
  52. sub ax,bx
  53. mov ds,cx ; restore si and ds
  54. mov si,dx
  55. ret
  56. _ptr_cmp_1 ENDP
  57. _ptr_cmp PROC
  58. mov bx,bp ; Save bp
  59. mov dx,di ; Save di
  60. mov bp,sp
  61. push ds
  62. push si
  63. mov cx,compare_length ; Length of memory-area
  64. lds si,DWORD PTR [bp+4] ; s1
  65. lds si,DWORD PTR ds:[si]
  66. les di,DWORD PTR [bp+8] ; s2
  67. les di,DWORD PTR es:[di]
  68. ; cld ; Work uppward
  69. xor ax,ax
  70. repe cmpsb ; Compare strings
  71. je @F ; Strings are equal
  72. sbb ax,ax
  73. cmc
  74. adc ax,0
  75. @@: pop si
  76. pop ds
  77. mov di,dx
  78. mov bp,bx
  79. ret
  80. _ptr_cmp ENDP
  81. else
  82. include macros.asm
  83. fix_es  MACRO   fix_cld                 ; Load ES if neaded
  84.   ife ESeqDS
  85.         mov     ax,ds
  86.         mov     es,ax
  87.   endif
  88.   ifnb <fix_cld>
  89.         cld
  90.   endif
  91.         ENDM
  92. begdata
  93. compare_length dd 0 ; Length of strings
  94. enddata
  95. begcode get_ptr_compare
  96. public _get_ptr_compare
  97. _get_ptr_compare proc near
  98. mov ecx,P-SIZEPTR[esp]
  99. mov compare_length,ecx
  100. mov eax,offset _TEXT:_ptr_cmp_0
  101. jecxz @F
  102. mov eax,offset _TEXT:_ptr_cmp_1
  103. dec ecx
  104. jz @F
  105. mov eax,offset _TEXT:_ptr_cmp
  106. @@: ret
  107. _get_ptr_compare endp
  108. endcode _get_ptr_compare
  109. begcode ptr_cmp_0
  110. _ptr_cmp_0 PROC
  111. mov EAX,0 ; Emptyt strings are always equal
  112. ret
  113. _ptr_cmp_0 ENDP
  114. endcode ptr_cmp_0
  115. begcode ptr_cmp_1
  116. _ptr_cmp_1 proc near
  117. mov edx,esi ; Save esi
  118. mov esi,P-SIZEPTR[esp] ; *s1
  119. mov esi,[esi]
  120. movzx eax,[esi]
  121. mov esi,P[esp] ; *s2
  122. mov esi,[esi]
  123. movzx ecx,[esi]
  124. sub eax,ecx
  125. mov esi,edx ; Restore esi
  126. ret
  127. _ptr_cmp_1 ENDP
  128. endcode ptr_cmp_1
  129. begcode ptr_cmp
  130. _ptr_cmp proc near
  131. fix_es 1
  132. push ebp
  133. mov ebp,esp
  134. mov edx,edi ; Save esi
  135. push esi
  136. mov esi,P[ebp] ; *s1
  137. mov esi,[esi]
  138. mov edi,P+SIZEPTR[ebp] ; *s2
  139. mov edi,[edi]
  140. mov ecx,compare_length ; Length of memory-area
  141. xor eax,eax
  142. repe cmpsb ; Compare strings
  143. je @F ; Strings are equal
  144. sbb eax,eax
  145. cmc
  146. adc eax,0
  147. @@: pop esi
  148. mov edi,edx
  149. pop ebp
  150. ret
  151. _ptr_cmp ENDP
  152. endcode ptr_cmp
  153. endif
  154. END