These are a pair of routine I use quite often. I know MemSet is virtualy the same as ZeroMemory in kernel32.dll, but there may be a time I want to use these in an embedded system where this dll won't be avaliable.
; *** INITIALIZE PROCEDURE FRAME *** ; Many times routines need local variables that are usually saved on the stack. At times it ; is convenient to have this space intialized to nulls. ; ENTRY: EBP = Top of procedure frame ; ESP + 4 = Bottom of frame ; LEAVE: EAX = 0 ; ECX = Size of procedure frame ; EDX = Base pointer to fill area. InitFrame xor eax, eax mov ecx, ebp ; Top of area mov edx, esp ; Bottom of area add edx, byte 4 ; Allow for callers return sub ecx, edx ; Calculate size of frame ; Now we can just fall into MemSet to fill procedure frame. ; ============================================================================================ ; *** MEMORY SET *** ; ENTRY: EAX = Fill pattern (32 bit). ; ECX = Total number of bytes to initialize. ; EDX = Base pointer to fill area. ; LEAVE: All registers preserved. ; NOTE: If EAX is not evenly divisible by 4 then all 4 bytes of EAX must be the same, ; otherwise last 1, 2 or 3 bytes of buffer will only be fill with AL. MemSet push edi push ecx ; Preserve registers push edx mov edi, edx ; Set destination index. mov dl, cl ; Save LSB of counter shr ecx, 2 ; Number of dwords that can be written cld ; Assure EDI will auto increment with STOS rep stosd mov cl, dl and cl, 3 ; Is buffer evenly divisible by 4 jz .Done ; ZR = 1, if so. rep stosb ; Write odd numbered bytes .Done pop edx pop ecx ; Restore registers pop edi ret