You are on page 1of 9

td_win32asm_003.

asm
;==============================================================================
;
Test Department's WINDOWS 32 BIT x86 ASSEMBLY TUTORIAL'S
003
;==============================================================================
;==============================================================================
; ==> Part 003 : using a bitmap graphic for the background
;-----------------------------------------------------------------------------; In this tutorial 003 we add a background graphic to our program.
; Try to use your own bitmap picture ( 512x200 pixel 256 color ) and increase
; your knowledge.
; We must include another library for the graphic API ( gdi32.lib )
;==============================================================================
; Assembler directives
;-----------------------------------------------------------------------------.386
; specifies the processor our program want run on
.Model Flat ,StdCall
; always the same for Win95 (32 Bit)
option casemap:none
; case sensitive !!!
;==============================================================================
; Include all files where API functins resist you want use
; You must set the correct path to the include and library files
;-----------------------------------------------------------------------------include D:\Masm32\include\windows.inc
includelib kernel32.lib
includelib user32.lib
includelib winmm.lib
includelib gdi32.lib
;==============================================================================
; Declaration of used API functions,take a look into WIN32.HLP and *.inc files
; GetModulHandle= example of an API function
; PROTO
= one or more parameter must pushed to the stack before call
; :DWORD
= the parameter, in this case doubleword (32 Bit)
;-----------------------------------------------------------------------------GetModuleHandleA
PROTO :DWORD
LoadIconA
PROTO :DWORD,:DWORD
LoadCursorA
PROTO :DWORD,:DWORD
RegisterClassExA
PROTO :DWORD
CreateWindowExA
PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,
:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ShowWindow
PROTO :DWORD,:DWORD
UpdateWindow
PROTO :DWORD
GetMessageA
PROTO :DWORD,:DWORD,:DWORD,:DWORD
TranslateMessage
PROTO :DWORD
DispatchMessageA
PROTO :DWORD
PostQuitMessage
PROTO :DWORD
DefWindowProcA
PROTO :DWORD,:DWORD,:DWORD,:DWORD
ExitProcess
PROTO :DWORD
PlaySoundA
PROTO :DWORD,:DWORD,:DWORD
MessageBoxA
PROTO :DWORD,:DWORD,:DWORD,:DWORD
DestroyWindow
PROTO :DWORD
Page 1

BeginPaint
EndPaint
LoadBitmapA
CreateCompatibleDC
SelectObject
BitBlt
DeleteDC
DeleteObject

td_win32asm_003.asm
:DWORD,:DWORD
:DWORD,:DWORD
:DWORD,:DWORD
:DWORD
:DWORD,:DWORD
:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,
:DWORD,:DWORD,:DWORD
PROTO :DWORD
PROTO :DWORD
PROTO
PROTO
PROTO
PROTO
PROTO
PROTO

;==============================================================================
; .const = the constants area starts here,constants are defined & fixed
; example_const = the constant name
; equ
= the value for this constant name follows
; 0Ah
= the value in hexadezimal
;-----------------------------------------------------------------------------.const
example_const
equ 0Ah
;not used, example only
; - Parameter MAIN WINDOW CallBack Procedure ( API=RegisterClassExA ) WP1_CallBack
equ [ebp+4]
;return address
WP1_hWnd
equ [ebp+8]
;handle of window who receives message
WP1_uMsg
equ [ebp+12]
;the message number
WP1_wParam
equ [ebp+16]
;extra info about the message
WP1_lParam
equ [ebp+20]
;extra info about the message
;==============================================================================
; .Data = the data area starts here, datas are defined but not fixed
; db
= databyte
1 Byte (8 Bit)
; dw
= dataword
2 Byte (16 Bit)
; dd
= doubleword
4 Byte (32 Bit)
; Textstrings are databyte and must be terminated by ,0
; ,13,10 means control and line feed
; db 41h dup (0) = reserved 41 hexadezimal databytes initialized to null
;-----------------------------------------------------------------------------.Data
example_text
db "First row",13,10
;not used,example only
db "Second row",0
;
IconName
db "TDIcon",0
;icon name in rc file
MenuName
db "TDMenu",0
;menu name in rc file
ClassName
db "TDWinClass",0
;name of windows class
WindowName
db "Test Department",0 ;window name titel bar
WaveName
db "TDWave",0
;wave name in resource file
MB1Titel
db "Realy Exit ?",0
;message box name
MB1Text
db "Your choice ...",0 ;message box text
PictureName
db "TDBitmap",0
;picture name in resource file
align 4
; - WndClassEx Structure ( API=RegisterClassExA ) cbSize
dd 0h
;size in bytes of this structure
style
dd 0h
;window style
lpfnWndProc
dd 0h
;address of user proc function
cbclsExtra
dd 0h
;extra bytes to allocate set to 0
cbWndExtra
dd 0h
;extra bytes class directive, rc file
Page 2

hInstance
hIcon
hcursor
hbrBackground
lpszMenuName
lpszClassName
hIconSm

dd
dd
dd
dd
dd
dd
dd

0h
0h
0h
0h
0h
0h
0h

td_win32asm_003.asm
;program handle(API=GetModuleHandleA)
;handle of icon (API=LoadIconA)
;handle of cursor (API=LoadCursor)
;background color, 0=transparent
;name of menu class in resource file
;name of windows this window class
;iconhandle 0=search in resource file

align 4
; - Msg Structure ( API=GetMessageA ) - member POINT = POINT structure
hWnd
dd 0h
;handle of window who receives message
message
dd 0h
;the message number
wParam
dd 0h
;extra info about the message
lParam
dd 0h
;extra info about the message
time
dd 0h
;time the message was posted
xpt
dd 0h
;cursor x-position, POINT struc
ypt
dd 0h
;cursor x-position, POINT struc
align 4
; - Paint Structure ( API=BeginPaint ) - member rcPaint = RECT structure
hdc
dd 0h
;id, display DC used for painting
fErase
dd 0h
;must background must be erased
rcPaint_left
dd 0h
;RECT,x-coordinate upper-left corner
rcPaint_top
dd 0h
;RECT,y-coordinate upper-left corner
rcPaint_right
dd 0h
;RECT,x-coordinate lower-right corner
rcPaint_bottom
dd 0h
;RECT,y-coordinate lower-right corner
fRestore
dd 0h
;reserved, used by Windows
fIncUpdate
dd 0h
;reserved, used by Windows
rgbReserved
db 20h dup (0) ;reserved, used by Windows
align 4
; - BitBlt Parameter ( API=BitBlt ) hdcDest
dd 0h
nXDest
dd 0h
nYDest
dd 0h
nWidth
dd 0h
nHeight
dd 0h
hdcSrc
dd 0h
nXSrc
dd 0h
nYSrc
dd 0h
dwRop
dd 0h

;handle of dest. device context


;x=dest. rect. up-left corner
;y=dest. rect. up-left corner
;width of destination rectangle
;height of destination rectangle
;handle of source device context
;x=src. rec. up-left corner
;y=src. rec. up-left corner
;raster operation code

;==============================================================================
; .Data? = the data? area starts here, not defined and not fixed
;-----------------------------------------------------------------------------.data?
example_data?
dd ?
;not used, example only
;==============================================================================
; .CODE = our code area starts here
Main = label of our program code
;-----------------------------------------------------------------------------.Code
Main:
Page 3

td_win32asm_003.asm
;==============================================================================
; Always get your program ID first (API=GetModuleHandleA)
;-----------------------------------------------------------------------------push
0h
;lpModuleHandle, 0=get program handle
call
GetModuleHandleA
;- API Function mov
hInstance,eax
;return value in eax=handle of program
;==============================================================================
; The API function "RegisterClassExA" registers a window class
; This API needs a "WNDCLASSEX" structure so we fill it with correct values
;-----------------------------------------------------------------------------mov
cbSize,30h
;size in bytes of WNDCLASSEX structure
mov
style,3h
;window style
mov
lpfnWndProc,OFFSET WP1
;address of user lpfnWndProc function
mov
cbclsExtra,0h
;extra bytes to allocate set to 0
mov
cbWndExtra,0h
;class directive in rc file
mov
hbrBackground,2h
;background,1=background(parameter+1)
mov
lpszMenuName,OFFSET MenuName
;menu name in resource file
mov
lpszClassName,OFFSET ClassName ;name of windows class
mov
hIconSm,0h
;iconhandle 0=search in rc file
;-----------------------------------------------------------------------------; API "LoadIconA" loads an icon defined in the resource file and store the
; handle in the "WNDCLASSEX" structure
;-----------------------------------------------------------------------------push
OFFSET IconName
;icon-string or icon resource id
push
hInstance
;our program handle
call
LoadIconA
;- API Function mov
hIcon,eax
;handle of newly loaded icon
;-----------------------------------------------------------------------------; API "LoadCursorA" loads a default system cursor, in this case we must set
; hInstance to 0 and lpCursorName to a default system cursor value, here 32512
; Then we push the cursor handle to "WNDCLASSEX" structure
;-----------------------------------------------------------------------------push
32512
;lpCursorName,default value in dezimal
push
0h
;hInstance, 0=default system cursor
call
LoadCursorA
;- API Function mov
hcursor,eax
;handle of the cursor
;-----------------------------------------------------------------------------; Now, after filled the "WNDCLASSEX" structure we call API "RegisterClassEx"
;-----------------------------------------------------------------------------push
OFFSET cbSize
;pointer to WNDCLASSEX structure
call
RegisterClassExA
;- API Function ;==============================================================================
; API "CreateWindowExA" creates an overlapped, pop-up, or child window with an
; extended style. The return value in EAX is the handle of the new window.
;-----------------------------------------------------------------------------push
0h
;lpParam, extra pointer data 0=no data
push
hInstance
;hInstance, handle of our program
push
0h
;hMenu, handle window menu 0=class menu
push
0h
;hWndParent, handle parent window 0=no
push
000000F8h
;intnHeight, window height pixel
Page 4

push
push
push
push
push
push
push
call
mov

0000020Ah
000000A0h
000000B0h
04CA0000h
OFFSET WindowName
OFFSET ClassName
0300h
CreateWindowExA
hWnd,eax

td_win32asm_003.asm
;intnWidth, window width pixel
;inty, vertical position window
;intx, horizontal position window
;dwStyle, 0=no sysmenu/close buttons
;lpWindowName, pointer to window name
;lpClassName, pointer to class name
;dwExStyle, extra window style 0=no
;- API Function ;hwnd,return value=handle of window

;==============================================================================
; API "ShowWindow" function sets the specified window's show state.
;-----------------------------------------------------------------------------push
1h
;nCmdShow, show state 1=SW_SHOWNORMAL
push
hWnd
;hwnd, handle of window
call
ShowWindow
;- API Function ;==============================================================================
; API "UpdateWindow" updates the area of the specified window by sending a
; WM_PAINT message to the window if the window's update region is not empty.
;-----------------------------------------------------------------------------push
hWnd
;hwnd, handle of window
call
UpdateWindow
;- API Function ;==============================================================================
; API "PlaySoundA" plays a wave sound, the value 40005h means the sound is
; defined inside the resource file.
;-----------------------------------------------------------------------------push
40005h
;SND_RESOURCE+SND_ASYNC
push
hInstance
;handle of our program
push
OFFSET WaveName
;wave name in rc file
call
PlaySoundA
;- API Function ;==============================================================================
; API "GetMessageA" retrieves a message & places it in the specified structure.
;-----------------------------------------------------------------------------LoopGetMessage:
push
0h
;wMsgFilterMax, highest message value
push
0h
;wMsgFilterMin, lowest message value
push
0h
;hWnd, handle of window who gets msg.
push
OFFSET hWnd
;lpMsg, pointer to MSG structure
call
GetMessageA
;- API Function cmp
eax,0h
;check if return value=0 (exit)
je
ExitPrg
;if return value is 0 goto LABEL
;==============================================================================
; API "TranslateMessage" translates key code into ASCII character messages
;-----------------------------------------------------------------------------push
OFFSET hWnd
;lpMSG, pointer to msg structure
call
TranslateMessage
;- API Function - keyboard code
;==============================================================================
; API "DispatchMessageA" function dispatches a message to a window procedure.
Page 5

td_win32asm_003.asm
;-----------------------------------------------------------------------------push
OFFSET hWnd
;lpMSG, pointer to msg structure
call
DispatchMessageA
;- API Function jmp
LoopGetMessage
;check for message again, goto LABEL
;==============================================================================
; Next we terminate our program (API=ExitProcess)
;-----------------------------------------------------------------------------ExitPrg:
push
hInstance
;push our programm handle to exit
call
ExitProcess
;- API Function ;##############################################################################
; This is the Window Procedure lpfnWndProc (API=RegisterClassExA) for this
; registered window.
; The WindowProc function is an application-defined callback function that
; processes messages sent to a window.
; Here our code for checking the receiving messages resist.
; In the future it is the main work for us to react to the recieved messages.
; It is also a good idea to PUSHAD all register, because than we are free to
; use all register in this window procedure.
; Before we leave this subroutine we must POPAD them back.
;-----------------------------------------------------------------------------WP1:
push
ebp
;create stack frame
mov
ebp,esp
;
pushad
;push all register to the stack
mov
eax,WP1_uMsg
;move the message number in eax
;==============================================================================
; WM_Destroy (value=2h) message received ?
;-----------------------------------------------------------------------------WP1_uMsg_02h:
cmp
eax,2h
;check if value=2h (WM_DESTROY)
jne
WP1_uMsg_0Fh
;if not 2h go to LABEL
call
My_CleanSystem
;- SubRoutine ;-----------------------------------------------------------------------------; API "PostQuitMessage" indicates to Windows a request to terminate
;-----------------------------------------------------------------------------push
0h
;nExitCode, exit code=wParam
call
PostQuitMessage
;- API Function popad
;pop all register back from stack
xor
eax,eax
;set eax to 0 to exit our program
mov
esp,ebp
;delete stack frame
pop
ebp
;
ret
10h
;return and clear stack
;==============================================================================
; WM_PAINT (value=0Fh) message, used to repaint the window area
;-----------------------------------------------------------------------------WP1_uMsg_0Fh:
cmp
eax,0Fh
;check if WM_PAINT message recieved
jne
WP1_uMsg_111h
;if not goto label
Page 6

td_win32asm_003.asm
;-----------------------------------------------------------------------------; API "BeginPaint" prepares the specified window for painting and fills a
; PAINTSTRUCT structure with information about the painting
;-----------------------------------------------------------------------------push
OFFSET hdc
;lpPaint, pointer to PAINTSTRUCT
push
WP1_hWnd
;hwnd, handle of the window
call
BeginPaint
;- API Function mov
hdcDest,eax
;handle, display device (DC)=dest.
;-----------------------------------------------------------------------------; API "LoadBitmapA" loads the specified bitmap resource from our module's
; executable file.
;-----------------------------------------------------------------------------push
OFFSET PictureName
;lpBitmapName,pic name in rc file
push
hInstance
;handle, id of our programm
call
LoadBitmapA
;- API Function push
eax
;hObject, PUSH handle of bitmap
;-----------------------------------------------------------------------------; API "CreateCompatibleDC" creates a memory device context (DC) compatible
; with the specified device.
;-----------------------------------------------------------------------------push
hdcDest
;hdc, display device (DC)=dest.
call
CreateCompatibleDC
;- API Function mov
hdcSrc,eax
;handle, memory device (DC)=src.
;-----------------------------------------------------------------------------; API "SelectObject" selects an object into the specified device context
;-----------------------------------------------------------------------------pop
eax
;hObject, POP handle of bitmap
push
eax
;
push
eax
;hObject, PUSH handle of bitmap
push
hdcSrc
;hdc, id memory device (DC)=src.
call
SelectObject
;- API Function ;-----------------------------------------------------------------------------; API "BitBlt" performs a bit-block transfer of the color data corresponding
; to a rectangle of pixels from the specified source device context into a
; destination device context.
;-----------------------------------------------------------------------------push
00CC0020h
;dwRop, raster operation code
push
0h
;nYSrc, y=src. rect. up-left corner
push
0h
;nXSrc, x=src. rect. up-left corner
push
hdcSrc
;hdcSrc, handle of source device
push
0C8h
;nHeight, height of dest. rect.
push
200h
;nWidth, width of dest. rect.
push
0h
;nYDest, y=dest. rect. up-left corner
push
0h
;nXDest, x=dest. rect. up-left corner
push
hdcDest
;hdcDest, handle destination device
call
BitBlt
;- API Function ;-----------------------------------------------------------------------------; API "DeleteDC" deletes the specified device context (DC)
;-----------------------------------------------------------------------------push
hdcSrc
;handle, memory device (DC)
call
DeleteDC
;- API Function ;-----------------------------------------------------------------------------; API "DeleteObject" deletes the bitmap, freeing all system resources
Page 7

td_win32asm_003.asm
; associated with the object.
; After the object is deleted, the specified handle is no longer valid.
;-----------------------------------------------------------------------------pop
eax
;hObject, POP handle of bitmap
push
eax
;
call
DeleteObject
;- API Function ;-----------------------------------------------------------------------------; API "EndPaint" marks the end of painting in the given window.
; This function is required for each call to the BeginPaint function, but only
; after painting is complete.
;-----------------------------------------------------------------------------push
OFFSET hdc
;lpPaint, pointer PAINTSTRUCT
push
WP1_hWnd
;hwnd, handle of the window
call
EndPaint
;- API Function jmp
WP1_return
;==============================================================================
; WM_COMMAND (value=111h) message recieved ?
;-----------------------------------------------------------------------------WP1_uMsg_111h:
;WM_COMMAND message, value=111h
cmp
eax,111h
;check if WM_COMMAND message recieved
jne
WP1_uMsg_112h
;if not goto label
WP1_wParam_01h:
mov
eax,WP1_wParam
;extra info about the message
cmp
ax,1h
;ID of "&Exit" item in rc file
jne
WP1_return
;if not 1h goto LABEL
;-----------------------------------------------------------------------------; API "MessageBoxA" creates a message box, we can choose if we want exit prg.
;-----------------------------------------------------------------------------push
4h
;uType, style, 4=MB_YESNO Button
push
OFFSET MB1Titel
;lpCaption,pointer to title text
push
OFFSET MB1Text
;lpText,pointer to text message box
push
WP1_hWnd
;handle of owner window 0=no owner
call
MessageBoxA
;- API Function cmp
eax,6h
;if return value=6h (IDYES) then exit
jne
WP1_return
;if return value=7h (IDNO) goto LABEL
;-----------------------------------------------------------------------------; API "DestroyWindow" function destroys the given window
;-----------------------------------------------------------------------------push
WP1_hWnd
;hwnd, handle of window to destroy
call
DestroyWindow
;- API Function jmp
WP1_return
;
;==============================================================================
; WM_SYSCOMMAND (value=112h) message recieved ?
;-----------------------------------------------------------------------------WP1_uMsg_112h:
cmp
eax,112h
;check if WM_COMMAND message recieved
jne
WP1_return
;if not goto label
mov
eax,WP1_wParam
;extra info about the message
cmp
eax,0F060h
;SC_CLOSE=0F060h received ?
jne
WP1_return
;
call
My_CleanSystem
;- SubRoutine Page 8

td_win32asm_003.asm
jmp

WP1_return

;==============================================================================
; API "DefWindowProcA" calls the window procedure to provide default processing
; for any window messages that an application does not process.
; This function ensures that every message is processed.
; It is called with the same parameters received by the window procedure.
;-----------------------------------------------------------------------------WP1_return:
popad
;pop all register from stack
push
WP1_lParam
;extra info about the message
push
WP1_wParam
;extra info about the message
push
WP1_uMsg
;the message number
push
WP1_hWnd
;handle of window who receives message
call
DefWindowProcA
;- API Function mov
esp,ebp
;delete stack frame
pop
ebp
;
ret
10h
;return and clear stack
;##############################################################################
;******************************************************************************
; My own subroutine(s) for a compacter code resist here ...
;-----------------------------------------------------------------------------My_CleanSystem:
ret
;******************************************************************************
;-----------------------------------------------------------------------------; end Main = end of our program code
;-----------------------------------------------------------------------------end Main
;end of our program code, entry point
;==============================================================================
; To create the exe file use this commands with your Microsoft Assembler/Linker
;-----------------------------------------------------------------------------; ml.exe /c /coff td_win32asm_003.asm
;asm command
; rc.exe /v rsrc.rc
;rc command
; cvtres.exe /machine:ix86 rsrc.res
; link.exe /subsystem:windows td_win32asm_003.obj rsrc.obj
;link command
;==============================================================================

Page 9

You might also like