blob: c505c48be72ef944b3052a7eb9738802af07d5b1 (
plain) (
blame)
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
  | 
%include "defs.asm"
;*************************  strcpy64.asm  ************************************
; Author:           Agner Fog
; Date created:     2008-07-19
; Last modified:    2011-07-01
; Description:
; Faster version of the standard strcpy function:
; char * A_strcpy(char * dest, const char * src);
; Copies zero-terminated string from src to dest, including terminating zero.
;
; Overriding standard function memcpy:
; The alias ?OVR_strcpy is changed to _strcpy in the object file if
; it is desired to override the standard library function strcpy.
;
; Optimization:
; Uses optimized functions A_strlen and A_memcpy. These functions allow
; calling without proper stack alignment.
;
; Copyright (c) 2011 GNU General Public License www.gnu.org/licenses
;******************************************************************************
default rel
global A_strcpy: function                 ; Function A_strcpy
global EXP(strcpy): function              ; ?OVR removed if standard function memcpy overridden
; Imported from strlen64.asm
extern A_strlen
; Imported from memcpy64.asm
extern A_memcpy
SECTION .text  align=16
; extern "C" char * A_strcpy(char * dest, const char * src) {
;    return memcpy(dest, src, strlen(src)+1);
; }
; Function entry:
A_strcpy:
EXP(strcpy):
%IFDEF  WINDOWS
%define Rpar1   rcx                    ; function parameter 1
%define Rpar2   rdx                    ; function parameter 2
%define Rpar3   r8                     ; function parameter 3
%ENDIF
%IFDEF  UNIX
%define Rpar1   rdi                    ; function parameter 1
%define Rpar2   rsi                    ; function parameter 2
%define Rpar3   rdx                    ; function parameter 3
%ENDIF
        push    Rpar1                  ; dest
        push    Rpar2                  ; src
        mov     Rpar1, Rpar2
        ; (A_strlen does not require stack alignment)
        call    A_strlen               ; length of src
        lea     Rpar3,[rax+1]          ; include terminating zero in length
        pop     Rpar2                  ; src
        pop     Rpar1                  ; dest
        jmp     A_memcpy               ; copy and return
;A_strcpy ENDP
  |