char.asm

You will see the body of the macro print here. This is not really necessary when you have the right includes. What happens is that the print macro will be expanded each time you use it, so you will have any number of .data and .code sections generated. This will not cause any problems.
; #########################################################################

      .386
      .model flat, stdcall
      option casemap :none   ; case sensitive

; #########################################################################

      include \masm32\include\windows.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc
      include \masm32\include\masm32.inc

      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib
      includelib \masm32\lib\masm32.lib

; #########################################################################

    ; ------------
    ; Local macros
    ; ------------
      print MACRO Quoted_Text:VARARG
        LOCAL Txt
          .data
            Txt db Quoted_Text,0
          .code
        invoke StdOut,ADDR Txt
      ENDM

   .data

    ; ------------
    ;StdOut requires that the data to be output is in the .data section of the program.
    ; ------------
ary db "My Message",0
txt db  ?, 0


    .code

start:

    ; ------------
    ;Start by printing out a single character and move cursor to the next line.
    ; ------------
    mov    al, 'A'
    mov    txt, al
    invoke StdOut,ADDR txt 
    print  10,13

    ; ------------
    ;Now print out the array one character at a time.
    ; ------------
    mov    ecx, 10              ;There are ten characters in the array.
    mov    esi, offset ary      ;Point to the beginning of the array
prntAry:
    mov    al, [esi]            ;Get next character.
    mov    txt, al              ;Save it in the output buffer.
    
    ; ------------
    ;I don't know what registers StdOut uses, so I will save my essential registers.
    ; ------------
    
    push   ecx                  
    push   esi
    invoke StdOut,ADDR txt      ;Now do the output
    
    ; ------------
    ;Restore my essential registers.
    ; ------------
    pop    esi
    pop    ecx
    
    inc    esi                  ;Point to the next character in the array
    loop   prntAry              ;The loop instruction decrements ECX and if not
                                ;  zero loop back up.
                                
    print  10,13                ;Move cursor to the next line.
    
    invoke ExitProcess,0        ;We are done.

end start