Это, наверное, самая простая программа.
Используются всего две функции:
   MessageBoxA  из USER32.DLL и
   ExitProcess  из KERNEL32.DLL.
Суффикс A у MessageBox означает, что функция работает с однобайтовыми
ANSI строками. Для двубайтных Unicode строк - суффикс W, e.g. MessageBoxW.
Сама функция MessageBox выводит сообщение в отдельном оконе, ее прототип:

int MessageBox(
  HWND hWnd,
  LPCSTR lpText,
  LPCSTR lpCaption,
  UINT uType
);

Параметры:
 hWnd - идентификатор окна, из которого вызывается MessageBox
 lpText - указатель на null-terminated строку, содержущая  текст сообщения
 lpCaption - указатель на null-terminated строку, содержущая  заголовок сообщения
 uType - вид диалогового окна

Функция ExitProcess заканчивает процесс и все образованные процессы из этого процесса.

VOID ExitProcess(
  UINT uExitCode,
);

 uExitCode - код выхода

Параметры функции передаются по следующей схеме:

    AnyFunction(first_param, second_param, third_param);

    push    [third_param]
    push    [second_param]
    push    [first_param]
    call    AnyFunction
или
    call    AnyFunction, [first_param], [second_param], [third_param]

Вот сама программа:

.386
.model flat

extrn            MessageBoxA:proc
extrn            ExitProcess:proc

.data

mb_text          db 'Hello, World!',0
mb_caption       db 'My first program',0

.code
start:
                 push   0
                 push   offset mb_caption
                 push   offset mb_text
                 push   0
                 call   MessageBoxA
                 push   0
                 call   ExitProcess

ends
end start

Программу можно взять здесь