How can I do Input/Output on a console with MASM?

Malfist picture Malfist · Apr 27, 2010 · Viewed 31.5k times · Source

I've googled and googled, and I've not found anything useful. How can I send output to the console, and accept user input from the console with assembly?

I'm using MASM32

Answer

PhiS picture PhiS · Apr 27, 2010

As filofel says, use the Win32 API. Here's a small hello world example:

.386
.MODEL flat, stdcall
 STD_OUTPUT_HANDLE EQU -11 
 GetStdHandle PROTO, nStdHandle: DWORD 
 WriteConsoleA PROTO, handle: DWORD, lpBuffer:PTR BYTE, nNumberOfBytesToWrite:DWORD, lpNumberOfBytesWritten:PTR DWORD, lpReserved:DWORD
 ExitProcess PROTO, dwExitCode: DWORD 

 .data
 consoleOutHandle dd ? 
 bytesWritten dd ? 
 message db "Hello World",13,10
 lmessage dd 13

 .code
 main PROC
  INVOKE GetStdHandle, STD_OUTPUT_HANDLE
  mov consoleOutHandle, eax 
  mov edx,offset message 
  pushad    
  mov eax, lmessage
  INVOKE WriteConsoleA, consoleOutHandle, edx, eax, offset bytesWritten, 0
  popad
  INVOKE ExitProcess,0 
 main ENDP
END main

To assemble:

ml.exe helloworld.asm /link /subsystem:console /defaultlib:kernel32.lib /entry:main

Now to capture input, you'd proceed similarly, using API functions such as ReadConsoleInput. I leave that as an exercise to you.