80x86 Assembly Code Formatting Demo


FormatCode Code Formatter is based on serveral powerful syntax parser engines so you can exactly control the appearance of your source code. Here is the code formatting demo of FormatCode 80x86 Assembly / x86 Asm Code Formatter to prove the ability of code formatting functions of FormatCode:

   ;--- Before Code Formatting ---

   .386
   .MODEL FLAT,STDCALL

   include  windows.inc
   include   user32.inc
   include      kernel32.inc
   include   gdi32.inc

   includelib   user32.lib
   includelib  kernel32.lib
   includelib      gdi32.lib

   WinMain	PROTO :DWORD, :DWORD, :DWORD, :SDWORD

   PolyBezier PROTO	STDCALL hdc:DWORD, apt:DWORD, num:DWORD
   DrawBezier    PROTO	STDCALL hdc:DWORD, apt:POINT

   WHITE_PEN	EQU 6
   BLACK_PEN	  EQU    7
   MK_LBUTTON    EQU 1
   MK_RBUTTON     EQU  2

   .data
   ClassName db "SimpleWinClass",0
   AppName db "Bezier Splines",0

   BezPoints	STRUCT ; 4 pairs of DWORD coordinates (x,y), (8 bytes/pair)

   Spt POINT {} ; Line start point
   Cp1    POINT {} ; Control point 1
   Cp2   POINT	{} ; Control point 2
   Ept		   POINT	{} ; Line end point

   BezPoints	ENDS

   apt	BezPoints	{}

   .data?
   hInstance HINSTANCE ?
   CommandLine LPSTR ?

   LOWORD	MACRO

   mov	eax, lParam
   and	 eax,  0FFFFh
   ENDM

   HIWORD	MACRO

   mov	    ebx, lParam
   shr	ebx, 16

   ENDM

   .code
   start:
   invoke   GetModuleHandle, NULL
   mov hInstance,eax
   invoke      GetCommandLine
   invoke    WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
   invoke   ExitProcess,eax

   WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:SDWORD

   LOCAL    wc:WNDCLASSEX
   LOCAL   msg:MSG
   LOCAL       hwnd:HWND

   mov  wc.cbSize,SIZEOF WNDCLASSEX
   mov     wc.style, CS_HREDRAW or CS_VREDRAW
   mov wc.lpfnWndProc, OFFSET WndProc
   mov  wc.cbClsExtra,NULL
   mov     wc.cbWndExtra,NULL
   push  hInstance
   pop    wc.hInstance
   mov wc.hbrBackground,COLOR_WINDOW+1
   mov       wc.lpszMenuName,NULL
   mov wc.lpszClassName,OFFSET ClassName
   invoke     LoadIcon,NULL,IDI_APPLICATION
   mov      wc.hIcon,eax
   mov     wc.hIconSm,0
   invoke     LoadCursor,NULL,IDC_ARROW
   mov          wc.hCursor,eax
   invoke    RegisterClassEx, addr wc

   INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
   WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
   CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
   hInst,NULL
   mov   hwnd,eax
   INVOKE   ShowWindow, hwnd,SW_SHOWNORMAL
   INVOKE  UpdateWindow, hwnd
   .WHILE TRUE
   INVOKE     GetMessage, ADDR msg,NULL,0,0
   .BREAK .IF (!eax)
   INVOKE    TranslateMessage, ADDR msg
   INVOKE   DispatchMessage, ADDR msg
   .ENDW
   mov eax,msg.wParam
   ret
   WinMain endp

   WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

   LOCAL hdc:HDC
   LOCAL  ps:PAINTSTRUCT

   mov   eax,uMsg

   .IF eax==WM_SIZE ; lParam gives new window size

   LOWORD	; Get low word from lParam in eax (cxClient)
   HIWORD	; Get high ebx (cyClient)

   ;	Set the End points

   shr	eax,2
   mov	 apt.Spt.x,eax
   shr	   ebx,1
   mov	     apt.Spt.y,ebx

   mov	  apt.Ept.y,ebx

   shl	 eax,1
   mov	     apt.Cp1.x,eax
   mov	    apt.Cp2.x,eax

   shr	       ebx,1
   mov	      apt.Cp1.y,ebx

   add	    ebx,apt.Spt.y
   mov	 apt.Cp2.y,ebx

   mov	  eax,apt.Cp1.x
   add	    eax,apt.Spt.x
   mov	  apt.Ept.x,eax

   .ELSEIF	eax==WM_LBUTTONDOWN || eax==WM_RBUTTONDOWN || eax==WM_MOUSEMOVE

   .IF (wParam & MK_LBUTTON) || (wParam & MK_RBUTTON)

   invoke GetDC, hWnd
   mov	hdc,eax
   invoke GetStockObject, WHITE_PEN
   invoke    SelectObject, hdc,eax
   invoke      DrawBezier, hdc, apt	; Paint out the bezier curve

   .IF (wParam & MK_LBUTTON)
   LOWORD
   HIWORD
   mov	    apt.Cp1.x,eax	; Reset Control Point 1
   mov	  apt.Cp1.y,ebx
   .ENDIF

   .IF (wParam & MK_RBUTTON)
   LOWORD
   HIWORD
   mov  	apt.Cp2.x,eax
   mov	     apt.Cp2.y,ebx
   .ENDIF

   invoke      GetStockObject, BLACK_PEN
   invoke    SelectObject, hdc,eax
   invoke DrawBezier, hdc, apt
   invoke        ReleaseDC, hWnd,hdc

   .ENDIF

   .ELSEIF eax==WM_PAINT

   invoke InvalidateRect, hWnd, NULL, TRUE

   invoke  BeginPaint, hWnd, ADDR ps
   mov	hdc,eax

   invoke DrawBezier, hdc, apt

   invoke     EndPaint, hWnd, ADDR ps

   .ELSEIF eax==WM_DESTROY

   invoke PostQuitMessage,NULL
   .ELSE

   invoke    DefWindowProc, hWnd, uMsg, wParam, lParam
   ret

   .ENDIF
   xor eax,eax
   ret

   WndProc endp


   DrawBezier  PROC  Hdc:DWORD, aapt:POINT

   invoke PolyBezier, Hdc, ADDR aapt, 4

   invoke    MoveToEx, Hdc, apt.Spt.x, apt.Spt.y, NULL
   invoke	    LineTo, Hdc, apt.Cp1.x, apt.Cp1.y

   invoke MoveToEx, Hdc, apt.Cp2.x, apt.Cp2.y, NULL
   invoke	    LineTo, Hdc, apt.Ept.x, apt.Ept.y

   ret
   DrawBezier	ENDP

   end start


   ;--- After Code Formatting ---

   .386
   .model flat, stdcall

   include windows.inc
   include user32.inc
   include kernel32.inc
   include gdi32.inc

   includelib user32.lib
   includelib kernel32.lib
   includelib gdi32.lib

   WinMain proto :DWORD, :DWORD, :DWORD, :SDWORD

   PolyBezier proto stdcall hdc:DWORD, apt:DWORD, num:DWORD
   DrawBezier proto stdcall hdc:DWORD, apt:POINT

   WHITE_PEN equ	6
   BLACK_PEN equ	7
   MK_LBUTTON equ	1
   MK_RBUTTON equ	2

   .data
   ClassName  db "SimpleWinClass", 0
   AppName    db "Bezier Splines", 0

   BezPoints struct ; 4 pairs of DWORD coordinates (x,y), (8 bytes/pair)

   Spt POINT	{}     ; Line start point
   Cp1 POINT	{}     ; Control point 1
   Cp2 POINT	{}     ; Control point 2
   Ept POINT	{}     ; Line end point

   BezPoints ends

   apt BezPoints	{}

   .data?
   hInstance    HINSTANCE ?
   CommandLine  LPSTR ?

   LOWORD macro

   mov EAX, lParam
   and EAX, 0FFFFh
   endm

   HIWORD macro

   mov EBX, lParam
   shr EBX, 16

   endm

   .code

   start:
   
       invoke GetModuleHandle, NULL
       mov    hInstance, EAX
       invoke GetCommandLine
       invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
       invoke ExitProcess, EAX

   ;--------------------------------------------------------------------------

   WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:SDWORD

       local   wc:WNDCLASSEX
       local   msg:MSG
       local   hwnd:HWND

       mov     wc.cbSize, sizeof WNDCLASSEX
       mov     wc.style, CS_HREDRAW or CS_VREDRAW
       mov     wc.lpfnWndProc, offset WndProc
       mov     wc.cbClsExtra, NULL
       mov     wc.cbWndExtra, NULL
       push    hInstance
       pop     wc.hInstance
       mov     wc.hbrBackground, COLOR_WINDOW+1
       mov     wc.lpszMenuName, NULL
       mov     wc.lpszClassName, offset ClassName
       invoke  LoadIcon, NULL, IDI_APPLICATION
       mov     wc.hIcon, EAX
       mov     wc.hIconSm, 0
       invoke  LoadCursor, NULL, IDC_ARROW
       mov     wc.hCursor, EAX
       invoke  RegisterClassEx, addr wc

       invoke  CreateWindowEx, NULL, addr ClassName, addr AppName, \
               WS_OVERLAPPEDWINDOW , CW_USEDEFAULT, \
               CW_USEDEFAULT       , CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, \
               hInst               , NULL
       mov     hwnd, EAX
       invoke  ShowWindow, hwnd, SW_SHOWNORMAL
       invoke  UpdateWindow, hwnd
       .while  TRUE
               invoke              GetMessage, addr msg, NULL, 0, 0
               .break              .if (!EAX)
               invoke              TranslateMessage, addr msg
               invoke              DispatchMessage, addr msg
       .endw
       mov     EAX, msg.wParam
       ret
   WinMain endp

   ;--------------------------------------------------------------------------

   WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

       local   hdc:HDC
       local   ps:PAINTSTRUCT

       mov     EAX, uMsg

       .if     EAX==WM_SIZE ; lParam gives new window size

               LOWORD ; Get low word from lParam in eax (cxClient)
               HIWORD ; Get high ebx (cyClient)

               ;	Set the End points

               shr     EAX, 2
               mov     apt.Spt.x, EAX
               shr     EBX, 1
               mov     apt.Spt.y, EBX

               mov     apt.Ept.y, EBX

               shl     EAX, 1
               mov     apt.Cp1.x, EAX
               mov     apt.Cp2.x, EAX

               shr     EBX, 1
               mov     apt.Cp1.y, EBX

               add     EBX, apt.Spt.y
               mov     apt.Cp2.y, EBX

               mov     EAX, apt.Cp1.x
               add     EAX, apt.Spt.x
               mov     apt.Ept.x, EAX

       .elseif EAX==WM_LBUTTONDOWN || EAX==WM_RBUTTONDOWN || EAX==WM_MOUSEMOVE

               .if     (wParam & MK_LBUTTON) || (wParam & MK_RBUTTON)

                       invoke  GetDC, hWnd
                       mov     hdc, EAX
                       invoke  GetStockObject, WHITE_PEN
                       invoke  SelectObject, hdc, EAX
                       invoke  DrawBezier, hdc, apt    ; Paint out the bezier curve

                       .if     (wParam & MK_LBUTTON)
                               LOWORD
                               HIWORD
                               mov     apt.Cp1.x, EAX  ; Reset Control Point 1
                               mov     apt.Cp1.y, EBX
                       .endif

                       .if     (wParam & MK_RBUTTON)
                               LOWORD
                               HIWORD
                               mov     apt.Cp2.x, EAX
                               mov     apt.Cp2.y, EBX
                       .endif

                       invoke  GetStockObject, BLACK_PEN
                       invoke  SelectObject, hdc, EAX
                       invoke  DrawBezier, hdc, apt
                       invoke  ReleaseDC, hWnd, hdc

               .endif

       .elseif EAX==WM_PAINT

               invoke  InvalidateRect, hWnd, NULL, TRUE

               invoke  BeginPaint, hWnd, addr ps
               mov     hdc, EAX

               invoke  DrawBezier, hdc, apt

               invoke  EndPaint, hWnd, addr ps

       .elseif EAX==WM_DESTROY

               invoke  PostQuitMessage, NULL
       .else

               invoke  DefWindowProc, hWnd, uMsg, wParam, lParam
               ret

       .endif
       xor     EAX, EAX
       ret

   WndProc endp


   ;--------------------------------------------------------------------------

   DrawBezier proc  Hdc:DWORD, aapt:POINT

       invoke PolyBezier, Hdc, addr aapt, 4

       invoke MoveToEx, Hdc, apt.Spt.x, apt.Spt.y, NULL
       invoke LineTo, Hdc, apt.Cp1.x, apt.Cp1.y

       invoke MoveToEx, Hdc, apt.Cp2.x, apt.Cp2.y, NULL
       invoke LineTo, Hdc, apt.Ept.x, apt.Ept.y

       ret
   DrawBezier endp

   end start


Click here to preview the 80x86 Assembly / x86 Asm Code Formatting Demo 2.

With FormatCode 80x86 Assembly Code Formatters, you can format any foreign x86 Asm source code to meet your preferred coding style or any common code convention in several seconds!