"lea" is kind of a funny instruction. It calculates an "effective address" - memory - but it doesn't really "do" anything with the memory, it just does arithmetic. Still, it requires a memory reference as its second parameter...
lea ecx, [msg1]
will work for ya. I consider the use of "lea" in this case to be "overkill". Essentially we're saying "tell me the address of the variable whose address is ...". "mov" is shorter in this case, but "lea" works, and does the same thing.
Where we really need "lea" is to calculate the address of a variable which doesn't have a fixed address, such as a "stack variable"...
push ebp
mov ebp, esp
sub esp, 4
...
The "sub" makes space on the stack for a 4-byte variable... at "ebp - 4". If we want to know the "[contents]" of the variable...
mov eax, [ebp - 4]
But if we want to know the address of the variable,
mov eax, ebp - 4 ; WRONG!
won't work - no such instruction. But...
lea eax, [ebp - 4]
will give us the address. We could also have done...
mov eax, ebp
sub eax, 4
but "lea" does it in one instruction. As I said, it does arithmetic.
If that isn't clear, ask again - perhaps we can come up with better examples...
Best,
Frank