Home | History | Annotate | Download | only in Ia32
      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