pero se supone que solo lo llamo una vez como es que escribe dos veces la cadena?
Llamas a sys_write dos veces (lineas 10 y 19). No es cosa del 0 terminador ya que pasas el tamaño exacto de la cadena como parametro pero tal vez eso este mal, fijate que valores tienen ahora y que valores toman si definis las variables asi:
Código
msg db 'Hola mundo!',10 ;cadena len equ $ - msg ;cadena mensaje2 db 'Y buenos dias NASM',10 length2 equ $ - mensaje2