;************************************************************************* ;************************************************************************* ;** ** ;** (C)Copyright 1985-2009, American Megatrends, Inc. ** ;** ** ;** All Rights Reserved. ** ;** ** ;** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** ;** ** ;** Phone: (770)-246-8600 ** ;** ** ;************************************************************************* ;************************************************************************* ;************************************************************************* ; $Header: /Alaska/SOURCE/Core/Modules/x64Core/x64AsmLib/MemSet.asm 1 10/01/10 5:08p Felixp $ ; ; $Revision: 1 $ ; ; $Date: 10/01/10 5:08p $ ;************************************************************************* ; Revision History ; ---------------- ; $Log: /Alaska/SOURCE/Core/Modules/x64Core/x64AsmLib/MemSet.asm $ ; ; 1 10/01/10 5:08p Felixp ; ; 1 8/24/06 12:57p Felixp ; ;************************************************************************* ; ; ; Name: ; ; Description: ; ; ;************************************************************************* .code ;************************************************************************* ; ; ; Name: MemSet ; ; Description: ; VOID MemSet(IN VOID *pBuffer, IN UINTN Count, IN UINT8 Value) fills Count ; bytes of memory in pBuffer with Value. ; ; Input: ; IN VOID *pBuffer ; The starting location in memory where to begin filling. ; ; IN UINTN Count ; The number of bytes to fill with Value. ; ; IN UINT8 Value ; The value to fill memory with starting at pBuffer. ; ; Output: ; VOID. ; ; Modified: ; ; Referrals: ; ; Notes: ; ; ;************************************************************************* MemSet proc push rdi push rbx mov rdi, rcx ; rdi = pBuffer mov rcx, rdx ; rcx = Count mov rax, r8 ; al = Value ; fill EAX with the Value so that we can perform DWORD operatins mov ah, al mov bx,ax shl rax,16 mov ax,bx ; if Counter is less then 4, jump to byte copy cmp rcx, 4 jb CopyByte ; check if the Buffer is 4-bytes aligned mov rdx,rdi and rdx, 3 ; if the Buffer is 4-bytes aligned, jump to DWORD copy jz CopyDword ; Buffer is not 4-bytes aligned ; Calculate 4-(Buffer%4), which is a number of bytes we have to copy before ; Buffer will reach 4-bytes boundary, and perform byte copy neg rdx add rdx, 4 xchg rcx, rdx sub rdx, rcx rep stosb mov rcx, rdx CopyDword: ; perform DWORD copy mov rdx, rcx shr rcx, 2 rep stosd ; copy the remainder and rdx,3 mov rcx, rdx CopyByte: rep stosb ;;; pop rbx pop rdi ret MemSet endp END ;************************************************************************* ;************************************************************************* ;** ** ;** (C)Copyright 1985-2009, American Megatrends, Inc. ** ;** ** ;** All Rights Reserved. ** ;** ** ;** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** ;** ** ;** Phone: (770)-246-8600 ** ;** ** ;*************************************************************************