HelloAssembly The smallest possible complete Windows application
HelloAssembly: Crafting the Minimalist Windows Application
This project, hosted by PlummersSoftwareLLC, is an exploration into the absolute limits of executable size for the Windows platform. The objective is to create the smallest possible complete application using x86 Assembly (ASM).
The project was inspired by and featured in two episodes of Dave's Garage:
- "Retrocoding the World's Smallest Windows App in x86 ASM"
- "C vs ASM: Making the World's SMALLEST Windows App"

🎯 Project Objectives
The goal is to produce a non-compressed binary that fulfills the following criteria:
- Implement a functional Windows message loop.
- Feature a standard title bar.
- Include working Minimize, Maximize, and Close buttons.
- Provide a functioning system menu.
- Render a background with centered text (at least as large as the phrase "Dave's Tiny App").
📁 Repository Architecture
The source code is organized into several directories based on the technique used:
TinyOriginal: Contains an optimized version of the initial codebase.Lasse: Utilizes shell coding strategies to reduce size.Theron: Features a manually constructed PE (Portable Executable) header.: This is dead code; it was an experiment to embed theQRCode.exeinto a QR code, kept for historical purposes.Crinkler: A specialized compressing linker for tiny binaries.templates&tools: Supporting files for the build process.
⚠️ Security Warning
Important: The optimization techniques used in the
Lassedirectory and theCrinklerlinker are highly aggressive. Because these methods mimic patterns often found in malware, your antivirus software may flag the resulting binaries as "suspected malware."
Depending on your security suite, you may experience the following:
- F-Secure SAFE: May require you to whitelist or exclude the executable.
- Microsoft Defender: May require a temporary total disablement of the scanner.
Disclaimer: Disabling security software is done at your own risk. While this repository contains no malicious code, we cannot vouch for binaries obtained from third-party sources.
🛠️ Build Instructions
1. Using Plain MASM32
The code in the Lasse folder can be compiled using MASM32 11.0. Use the following command:
ml /coff LittleWindows.asm /link /merge:.rdata=.text /merge:.data=.text /align:4 /subsystem:windows LittleWindows.obj
Result: LittleWindows.exe
2. Using MASM32 with Crinkler
Crinkler is a linker designed for executables only a few KB in size. For best results, use the Windows 10 SDK version 10.0.20348.0.
For the Lasse directory:
ml /c /coff LittleWindows.asm
crinkler.exe /NODEFAULTLIB /ENTRY:start /SUBSYSTEM:WINDOWS /TINYHEADER /NOINITIALIZERS /UNSAFEIMPORT /ORDERTRIES:1000 /TINYIMPORT /LIBPATH: "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.20348.0\um\x86" kernel32.lib LittleWindows.obj
Result: out.exe
For the TinyOriginal directory:
ml /c /coff /IC:\masm32\include Tiny.asm
crinkler.exe /ENTRY:MainEntry /SUBSYSTEM:WINDOWS /TINYHEADER /NOINITIALIZERS /UNSAFEIMPORT /ORDERTRIES:2000 /TINYIMPORT /LIBPATH: "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.20348.0\um\x86" kernel32.lib user32.lib gdi32.lib Tiny.obj /OUT:tiny.exe
Result: tiny.exe
3. Using Yasm
The Theron directory requires Yasm (a BSD-licensed NASM rewrite). Download the "general use" version.
yasm -fbin -o HelloWindows.exe HelloWindows.asm
Result: HelloWindows.exe

📊 Size Comparison
The efficiency of a build can be represented by the formula:
As of March 11, 2023, the smallest working versions are:
| Source File | Linker Used | Size (Bytes) |
|---|---|---|
Lasse\LittleWindows.asm | MASM32 | 1104 |
Lasse\LittleWindows.asm | Crinkler | 818 |
TinyOriginal\Tiny.asm | Crinkler | 540 |
Theron\HelloWindows.asm | Yasm | 383 |