Here you are trying to dereference the pointer which points to size char, but you try to load an int from it.
mov eax, [msg2]
Not sure if this is the right syntax, but you might use
mov eax, offset msg3
here, to load the address, or use the lea
instruction.
In C this would be similar to:
char msg2[10];
char *p = &msg2[0];
int x = *p;
This instruction doesn't dereference the pointer, it just takes the address of it and it can also calculate addresses with certain operators.
lea eax, [msg2] // <-
Is aequivalent of:
char msg2[10];
char *p = &msg2[0];