The three append procedures work like this.
IF 0 ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
Build this template with "CONSOLE ASSEMBLE AND LINK"
ENDIF ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
include \masm32\include\masm32rt.inc
.code
start:
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
call main
inkey
exit
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
main proc
LOCAL pbuf :DWORD ; allocate a pointer
LOCAL buffer[260]:BYTE ; allocate a buffer
LOCAL cloc :DWORD ; location pointer
LOCAL wrds1 :DWORD
LOCAL wrds2 :DWORD
LOCAL wrds3 :DWORD
LOCAL wrds4 :DWORD
LOCAL wrds5 :DWORD
LOCAL wrds6 :DWORD
mov wrds1, chr$("one ")
mov wrds2, chr$("two ")
mov wrds3, chr$("three ")
mov wrds4, chr$("four ")
mov wrds5, chr$("five ")
mov wrds6, chr$("six ")
; -------------
; simple append
; -------------
mov pbuf, ptr$(buffer) ; set pointer to buffer address
fn szCopy,wrds1,pbuf
fn szCatStr,pbuf,wrds2
fn szCatStr,pbuf,wrds3
fn szCatStr,pbuf,wrds4
fn szCatStr,pbuf,wrds5
fn szCatStr,pbuf,wrds6
print pbuf,13,10
; -----------------
; sequential append
; -----------------
mov pbuf, ptr$(buffer) ; set pointer to buffer address
mov cloc, 0
mov cloc, rv(szappend,pbuf,wrds1,cloc)
mov cloc, rv(szappend,pbuf,wrds2,cloc)
mov cloc, rv(szappend,pbuf,wrds3,cloc)
mov cloc, rv(szappend,pbuf,wrds4,cloc)
mov cloc, rv(szappend,pbuf,wrds5,cloc)
mov cloc, rv(szappend,pbuf,wrds6,cloc)
print pbuf,13,10
; ---------------
; combined append
; ---------------
mov pbuf, ptr$(buffer) ; set pointer to buffer address
fn szMultiCat,6,pbuf,wrds1,wrds2,wrds3,wrds4,wrds5,wrds6
print pbuf,13,10
ret
main endp
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
end start