; ######################################################################### .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