1 ;/*++ 2 ; 3 ;Copyright (c) 2007, Intel Corporation. All rights reserved.<BR> 4 ;This program and the accompanying materials 5 ;are licensed and made available under the terms and conditions of the BSD License 6 ;which accompanies this distribution. The full text of the license may be found at 7 ;http://opensource.org/licenses/bsd-license.php 8 ; 9 ;THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10 ;WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11 ; 12 ;Module Name: 13 ; 14 ; EfiCopyMemRep1.asm 15 ; 16 ;Abstract: 17 ; 18 ; This is the code that uses rep movsb CopyMem service 19 ; 20 ;--*/ 21 ; 22 ;--------------------------------------------------------------------------- 23 .686 24 .model flat,C 25 .code 26 27 ;--------------------------------------------------------------------------- 28 ;#include "Tiano.h" 29 ; 30 ;VOID 31 ;EfiCommonLibCopyMem ( 32 ; IN VOID *Destination, 33 ; IN VOID *Source, 34 ; IN UINTN Count 35 ; ) 36 ;/*++ 37 ; 38 ;Routine Description: 39 ; 40 ; Copy Length bytes from Source to Destination. 41 ; 42 ;Arguments: 43 ; 44 ; Destination - Target of copy 45 ; 46 ; Source - Place to copy from 47 ; 48 ; Length - Number of bytes to copy 49 ; 50 ;Returns: 51 ; 52 ; None 53 ; 54 ;--*/ 55 EfiCommonLibCopyMem PROC 56 push ebp 57 mov ebp, esp 58 push esi 59 push edi 60 mov esi, dword ptr[ebp + 0Ch] ; esi <- Source 61 mov edi, dword ptr[ebp + 8] ; edi <- Destination 62 mov edx, dword ptr[ebp + 10h] ; edx <- Count 63 cmp esi, edi 64 je _CopyDone 65 cmp edx, 0 66 je _CopyDone 67 lea eax, [esi + edx - 1] ; eax <- End of Source 68 cmp esi, edi 69 jae _CopyBytes 70 cmp eax, edi 71 jb _CopyBytes ; Copy backward if overlapped 72 mov esi, eax ; esi <- End of Source 73 lea edi, [edi + edx - 1] ; edi <- End of Destination 74 std 75 _CopyBytes: 76 mov ecx, edx 77 rep movsb ; Copy bytes backward 78 cld 79 _CopyDone: 80 pop edi 81 pop esi 82 pop ebp 83 ret 84 EfiCommonLibCopyMem ENDP 85 END 86 87