Outputting Hello World in MASM using WIN32 Functions
Asked Answered
C

3

11

Contents

  1. Intro
  2. Code
  3. Assembling and Running
  4. Miscellaneous
  5. Question

1. Intro

This isn't a question per se (though there is one at the bottom) but a HelloWorld app for people on StackOverflow to experiment with.

When I was first trying programing in MASM I tried to find a working HelloWorld application that used the WIN32 API calls (so not linking to C libraries) but couldn't find one (in MASM Syntax). So now that I have some experience I have written one for others wanting to learn assembly to fiddle with.

2. Code

.386 ; 386 Processor Instruction Set

.model flat,stdcall ; Flat memory model and stdcall method

option casemap:none ; Case Sensitive

;Libaries and Include files used in this project

; Windows.inc defines alias (such as NULL and STD_OUTPUT_HANDLE in this code
include \masm32\include\windows.inc 

; Functions that we use (GetStdHandle, WriteConsole, and ExitProcess)
; Listing of all available functions in kernel32.lib
include \masm32\include\kernel32.inc 
; Actuall byte code available of the functions
includelib \masm32\lib\kernel32.lib  

.data
; Labels that with the allocated data (in this case Hello World!...) that are aliases to memory.
output db "Hello World!", 0ah, 0h; This String Hello World! and then a the newline character \n (0ah) and then the null character 0h

.code 
start: 

; --------------------------------------------------------------------------------------------------------------------------------------
; Retrieves that handle to the output console
;
; ====Arguments===
;
; STD_OUTPUT_HANDLE - alias for -11 and indicates that we want the handle to 
;                     write to console output
;
invoke GetStdHandle, STD_OUTPUT_HANDLE
; --------------------------------------------------------------------------------------------------------------------------------------

; --------------------------------------------------------------------------------------------------------------------------------------
; Writes the text in output (.data section) to the console
;
; ====Arguments===
;
; eax - the handle to the console buffer
;
; addr output - pass by reference the text of output (Hello World!)
;
; sizeof output - the size of the string so that the WriteConsole knows when to 
;                 stop (doesn't support NULL terminated strings I guess);
;
; ebx - secondary "return" value that contains the number of bytes written (eax
;       is used for an error code)
;
; NULL - this is reserved and MSDN says just to pass NULL
;
; MSDN Link: http://msdn.microsoft.com/en-us/library/ms687401(v=VS.85).aspx
;
invoke WriteConsole, eax, addr output, sizeof output, ebx, NULL
; --------------------------------------------------------------------------------------------------------------------------------------

; --------------------------------------------------------------------------------------------------------------------------------------
; Exits the program with return code 0 (default one that usually is used to 
; indicate that the program did not error
;
; ====Arguments===
;
; 0 - the exit code
;
; MSDN Link: http://msdn.microsoft.com/en-us/library/ms682658(VS.85).aspx
;
invoke ExitProcess, 0
; --------------------------------------------------------------------------------------------------------------------------------------

end start 

3. Assembling and Running

I assume you have MASM32 installed in your C:\MASM32 directory.

  • If you do not have MASM installed please go to http://masm32.com/install.htm and follow the instructions.

  • If MASM32 is installed in a different directory please change the instructions accordingly.

    1. Open up the MASM32 Editor (QEditor) by either clicking on the Desktop Shortcut or if there is no shortcut go to C:\MASM32\ and double click qeditor.exe

    2. Copy the code in the code section (only the text that has a gray background) and paste it into the MASM32 Editor (QEditor) and save it.

    3. After saving the code click the Project menu and select Console Assemble and Link (NOT Assemble and Link (see Miscellaneous))

    4. Go to START and click Run, then type cmd and hit ENTER a black box with gray text should appear

    5. Navigate, using Explorer, to where you saved the code in step 3. There should now be a file with the same name as your source file (step 3) but be an exe. Drag and drop the exe file from the Explorer window to the cmd box (step 4 the black box)

    6. Select the black box and hit ENTER, the text "Hello World!" should appear.

4. Miscellaneous

Why do I have to click Console Assemble and Run and not just Assemble and Run in the Project Menu?

The reason you have to click Console Assemble and Run is because there are two types of applications, there are GUIs and then there are text base console (DOS) applications. The Hello Would Application is a text based one and so when assembled must be have the settings a console based app would and not a GUI.

See the third paragraph under Remarks in this link for a more detailed explanation.

5. Question

Ok now the question, does anyone here see any problems, errors, or general issues with this code or have any suggestions

Canterbury answered 31/12, 2010 at 5:33 Comment(0)
J
7

The program is fine. It is indeed "Hello World" version of Win32. However, remember its a console program. In Win32, you will be mostly dealing with Windows, Dialog Boxes and very less with Console (Incase, you want to deal specifically with console, thats another story).

If you want to lean Win32 Assembly, I strongly suggest you to look at Iczelion Tutorials.

Here is the "Hello World" to start with his tutorials:

http://win32assembly.online.fr/tut2.html

Jermayne answered 31/12, 2010 at 5:57 Comment(2)
I am looking at them and they are indeed a good set of tutorials but almost all programing tutorials start you off with the console and command line applications.Canterbury
I agree, but its an exception in case of win32 programming, because here you are not learning the language but the win32 platform.Jermayne
J
3

This sample code is simpler and easy to understand

.386
.model flat, stdcall
option casemap: none

include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib

.data
    szCaption   db  'Hello', 0
    szText      db  'Hello, World!', 0

.code
    start:
            invoke MessageBox, NULL, offset szText, offset szCaption, MB_OK
            invoke ExitProcess, NULL        
    end start
Journalist answered 15/10, 2013 at 23:49 Comment(3)
Uh this is a) rather old b) doesnt do what the code is suppose to! and c) explains none of it for a beginner!Canterbury
This is not old... it compiles.. and it prints a Hello World message box by using Win32 API... The invoke is a quicker way rather than pushing parametersJournalist
Um this question is over a year old it is old... Also this is to show how to do it without invoke which does a lot of things for you.Canterbury
R
0

StdOut is a console function

You can use MessageBox function...

.model small,pascal,nearstack
.386
?WINPROLOGUE=1
include win.inc
includelib libw.lib
extern __astart:proc

.data
text sbyte "Hello f*** World!",0
title sbyte "Win",0

.code
WinMain    PROC, hInstance:HANDLE, hPrevInstance:HANDLE, lpszCmdLine:LPSTR, nCmdShow,WORD
  LOCAL msg:MSG

 invoke MessageBox, NULL, addr text, addr title, 0
 invoke PostQuitMessage,0

 .while TRUE
     invoke GetMessage,addr msg,NULL,0,0
     .break .if (ax == 0)
     invoke TranslateMessage,addr msg
     invoke DispatchMessage,addr msg
 .endw
WinMain    ENDP
END        __astart
Ringnecked answered 2/1, 2011 at 18:10 Comment(1)
This was for the classical hello world, just like in c with printf.Canterbury

© 2022 - 2024 — McMap. All rights reserved.