; The M13_COPYNEW.ASM file
.586P
.MODEL FLAT, stdcall ; Flat memory model
EXTERN NEWARRAY@4:NEAR ; This procedure is defined in M13_NEWARRAY.cpp
EXTERN strlen:NEAR ; This procedure is part of the C standard library
PUBLIC COPYNEW ; COPYNEW is externally visible to the linker
_TEXT SEGMENT ; Code segment begins
; Procedure for copying the source string into newly allocated string
; Input: str1 is the pointer to the source string
; Output: EAX is the pointer to the dynamically allocated target string
COPYNEW PROC str1: DWORD
push esi ; preserve registers
push edi
mov esi, str1 ; get pointer to the source string
push esi
call strlen ; calculate source string size
inc eax ; Account for terminating null character
push eax ; push required size of the memory block
call NEWARRAY@4 ; allocate new block of memory
mov edi, eax ; initialize destination pointer
push eax ; preserve dynamic memory address
L1:
mov al, byte ptr [esi] ; copy characters from source...
mov byte ptr [edi], al ; ...to destination, including terminating zero
cmp al, 0 ; end of string is reached ?
je L2 ; Yes, the destination string is ready
inc esi ; No, keep copying...
inc edi
jmp L1
L2:
pop eax ; return pointer to dynamic memory
pop EDI ; restore preserved registers
pop ESI
ret
COPYNEW ENDP
_TEXT ENDS ; Code segment begins
END