1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
| ;------------------------------------------------------------------------------
| ;
| ; Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
| ; SPDX-License-Identifier: BSD-2-Clause-Patent
| ;
| ; Module Name:
| ;
| ; CopyMem.nasm
| ;
| ; Abstract:
| ;
| ; CopyMem function
| ;
| ; Notes:
| ;
| ;------------------------------------------------------------------------------
|
| SECTION .text
|
| ;------------------------------------------------------------------------------
| ; VOID *
| ; EFIAPI
| ; InternalMemCopyMem (
| ; IN VOID *Destination,
| ; IN VOID *Source,
| ; IN UINTN Count
| ; );
| ;------------------------------------------------------------------------------
| global ASM_PFX(InternalMemCopyMem)
| ASM_PFX(InternalMemCopyMem):
| push esi
| push edi
| mov esi, [esp + 16] ; esi <- Source
| mov edi, [esp + 12] ; edi <- Destination
| mov edx, [esp + 20] ; edx <- Count
| lea eax, [esi + edx - 1] ; eax <- End of Source
| cmp esi, edi
| jae .0
| cmp eax, edi ; Overlapped?
| jae @CopyBackward ; Copy backward if overlapped
| .0:
| mov ecx, edx
| and edx, 7
| shr ecx, 3 ; ecx <- # of Qwords to copy
| jz @CopyBytes
| push eax
| push eax
| movq [esp], mm0 ; save mm0
| .1:
| movq mm0, [esi]
| movq [edi], mm0
| add esi, 8
| add edi, 8
| loop .1
| movq mm0, [esp] ; restore mm0
| pop ecx ; stack cleanup
| pop ecx ; stack cleanup
| jmp @CopyBytes
| @CopyBackward:
| mov esi, eax ; esi <- Last byte in Source
| lea edi, [edi + edx - 1] ; edi <- Last byte in Destination
| std
| @CopyBytes:
| mov ecx, edx
| rep movsb
| cld
| mov eax, [esp + 12]
| pop edi
| pop esi
| ret
|
|
|