home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / crt / src / platform / memset.asm < prev    next >
Assembly Source File  |  1998-06-17  |  4KB  |  136 lines

  1.         page    ,132
  2.         title   memset - set sections of memory all to one byte
  3. ;***
  4. ;memset.asm - set a section of memory to all one byte
  5. ;
  6. ;       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
  7. ;
  8. ;Purpose:
  9. ;       contains the memset() routine
  10. ;
  11. ;*******************************************************************************
  12.  
  13.         .xlist
  14.         include cruntime.inc
  15.         .list
  16.  
  17. page
  18. ;***
  19. ;char *memset(dst, value, count) - sets "count" bytes at "dst" to "value"
  20. ;
  21. ;Purpose:
  22. ;       Sets the first "count" bytes of the memory starting
  23. ;       at "dst" to the character value "value".
  24. ;
  25. ;       Algorithm:
  26. ;       char *
  27. ;       memset (dst, value, count)
  28. ;               char *dst;
  29. ;               char value;
  30. ;               unsigned int count;
  31. ;               {
  32. ;               char *start = dst;
  33. ;
  34. ;               while (count--)
  35. ;                       *dst++ = value;
  36. ;               return(start);
  37. ;               }
  38. ;
  39. ;Entry:
  40. ;       char *dst - pointer to memory to fill with value
  41. ;       char value - value to put in dst bytes
  42. ;       int count - number of bytes of dst to fill
  43. ;
  44. ;Exit:
  45. ;       returns dst, with filled bytes
  46. ;
  47. ;Uses:
  48. ;
  49. ;Exceptions:
  50. ;
  51. ;*******************************************************************************
  52.  
  53.         CODESEG
  54.  
  55.         public  memset
  56. memset proc
  57.  
  58.         .FPO    ( 0, 3, 0, 0, 0, 0 )
  59.  
  60.         mov     edx,[esp + 0ch] ; edx = "count"
  61.         mov     ecx,[esp + 4]   ; ecx points to "dst"
  62.  
  63.         test    edx,edx         ; 0?
  64.         jz      short toend     ; if so, nothing to do
  65.  
  66.         xor     eax,eax
  67.         mov     al,[esp + 8]    ; the byte "value" to be stored
  68.  
  69.  
  70. ; Align address on dword boundary
  71.  
  72.         push    edi             ; preserve edi
  73.         mov     edi,ecx         ; edi = dest pointer
  74.  
  75.         cmp     edx,4           ; if it's less then 4 bytes
  76.         jb      tail            ; tail needs edi and edx to be initialized
  77.  
  78.         neg     ecx
  79.         and     ecx,3           ; ecx = # bytes before dword boundary
  80.         jz      short dwords    ; jump if address already aligned
  81.  
  82.         sub     edx,ecx         ; edx = adjusted count (for later)
  83. adjust_loop:
  84.         mov     [edi],al
  85.         inc     edi
  86.         dec     ecx
  87.         jnz     adjust_loop
  88.  
  89. dwords:
  90. ; set all 4 bytes of eax to [value]
  91.         mov     ecx,eax         ; ecx=0/0/0/value
  92.         shl     eax,8           ; eax=0/0/value/0
  93.  
  94.         add     eax,ecx         ; eax=0/0val/val
  95.  
  96.         mov     ecx,eax         ; ecx=0/0/val/val
  97.  
  98.         shl     eax,10h         ; eax=val/val/0/0
  99.  
  100.         add     eax,ecx         ; eax = all 4 bytes = [value]
  101.  
  102. ; Set dword-sized blocks
  103.         mov     ecx,edx         ; move original count to ecx
  104.         and     edx,3           ; prepare in edx byte count (for tail loop)
  105.         shr     ecx,2           ; adjust ecx to be dword count
  106.         jz      tail            ; jump if it was less then 4 bytes
  107.  
  108.         rep     stosd
  109. main_loop_tail:
  110.         test    edx,edx         ; if there is no tail bytes,
  111.         jz      finish          ; we finish, and it's time to leave
  112. ; Set remaining bytes
  113.  
  114. tail:
  115.         mov     [edi],al        ; set remaining bytes
  116.         inc     edi
  117.  
  118.         dec     edx             ; if there is some more bytes
  119.         jnz     tail            ; continue to fill them
  120.  
  121. ; Done
  122. finish:
  123.         mov     eax,[esp + 8]   ; return dest pointer
  124.         pop     edi             ; restore edi
  125.  
  126.         ret
  127.  
  128. toend:
  129.         mov     eax,[esp + 4]   ; return dest pointer
  130.  
  131.         ret
  132.  
  133. memset  endp
  134.  
  135.         end
  136.