For complicated reasons, I started playing with Flat Assembler today. Ripping apart someone else’s code, I was able to come up with this gem that creates a dialog box with a dead button. When compiled, the executable is a mere 2,500 bytes. I’m not sure I’d want to do an entire app in assembler, but it does seem to cut to the chase of the Windows API very well.
format PE GUI 4.0 entry codestart include 'win32a.inc' IDD_MAIN = 100 ID_START = 201 section '.data' data readable writeable hInstance dd ? section '.code' code readable executable codestart: invoke GetModuleHandle, 0 mov [hInstance], eax invoke DialogBoxParam, eax, IDD_MAIN, HWND_DESKTOP, \ MainDlg, 0 invoke ExitProcess, 0 proc MainDlg hdlg, msg, wparam, lparam push ebx esi edi cmp [msg], WM_INITDIALOG je .wminitdlg cmp [msg], WM_COMMAND je .wmcommand cmp [msg], WM_CLOSE je .wmclose xor eax, eax jmp .finish .wminitdlg: jmp .finish .wmcommand: cmp [wparam], BN_CLICKED shl 16 + ID_START je .startbutton .wmclose: invoke EndDialog, [hdlg], 0 .startbutton: jmp .finish .finish: pop edi esi ebx ret endp section '.idata' import data readable writeable library kernel, 'KERNEL32.DLL',\ user, 'USER32.DLL' import kernel,\ GetModuleHandle,'GetModuleHandleA',\ ExitProcess, 'ExitProcess' import user,\ DialogBoxParam, 'DialogBoxParamA',\ EndDialog, 'EndDialog' section '.rsrc' resource data readable directory RT_DIALOG, dialogs resource dialogs,\ IDD_MAIN, LANG_ENGLISH + SUBLANG_DEFAULT, \ main_dialog dialog main_dialog, 'Dialog test', 0, 0, 150, 50, \ WS_CAPTION + WS_POPUP + WS_SYSMENU +\ DS_MODALFRAME + DS_CENTER dialogitem 'BUTTON', 'Hello', ID_START, \ 50, 15, 50, 20, WS_VISIBLE + WS_TABSTOP enddialog