mov [Age], Other
I'm surprised this assembles without a size specifier, but in any case, you're loading the address of "Other" into "[Age]". The fact that it apparently spells "sir" is coincidence.
To start with something really simple, "a" + "b" = "ab"...
section .data
str1 db "a", 0
str2 db "b", 0
section .text
;mov [str1 + 1], [str2] ; Nope! No such instruction!
mov al, [str2]
mov [str1 + 1], al
Now we've got "ab"... but we haven't got it zero-terminated, and we haven't left a space for the zero! If I understand the man page for strcat() correctly, it expects the "destination" string to have space for the concatenated characters, plus the terminating zero(!). I can't believe that's right, but okay...
str1 db "a", 0, 0
There!
Pretty limited, though! We could do a slightly more "general" version...
CATSIZ equ 20 ; ought to be enough, unless you've got a long name
str1 db "Hello, ", 0
times CATSIZ db 0
str2 db "Josh!", 10, 0 ; or 13, 10 for dos, if you want a newline
Now I suppose we could do:
mov al, [str2]
mov [str1 + 7], al
mov al, [str2 + 1]
mov [str1 + 8], al
mov al, [str2 + 2]
mov [str1 + 9], al
...
This would get old real quick! I'm not even sure I've got 'em counted right in the first place. As Christian suggests, it's time to learn addressing with registers! So far, you haven't told us what size of registers you'll be using - 16-bit, 32-bit, or 64-bit. I'll go with 32-bit, since it's what I'm used to, but I'll try to keep it 16-bit compatible (it makes a difference!). 64-bit code is above my pay grade!
section .data
CATSIZ equ 20 ; ought to be enough, unless you've got a long name
str1 db "Hello, ", 0
times CATSIZ db 0
str2 db "Josh!", 10, 0 ; or 13, 10 for dos, if you want a newline
section .text
_start: ; or so, per your output format, etc.
mov edi, str1 ; address(!) of str1
mov esi, str2
mov ecx, CATSIZ
findend:
mov al, [edi]
inc edi
cmp al, 0
jnz findend
; we want to overwrite the zero, and we've gone one past it
dec edi
copystr:
mov al, [esi]
mov [edi], al
cmp al, 0 ; are we at the end of str2?
jz endstrcat
inc esi
inc edi
dec ecx
jnz copystr
; we're at the end of the "extra space" in str1!
; Terminate what we've got, and quit.
; again, we've gone "one past".
mov byte [edi - 1], 0
endstrcat:
; print out your masterpiece
; exit cleanly
That's untested, and may well have errors. It is far from optimal. Should be a subroutine. Etc. But I think it's the general idea of what you need to do to "add two strings together". There are "string instructions" (lodsb, stosb, scasb, movsb,...) that might be helpful, but they do pretty much the same thing as above. As I mentioned, I'd probably use a separate "result buffer", rather than demand that "str1" had space at the end of it (and trash "str1" for any further use...), but still the same idea. Told ya it would take multiple instructions!
Best,
Frank