Skip to main content

Play with Docker and Assembly programming language

Learn how to combine modern Docker technology with the classic x86 Assembly programming language. This guide provides a step-by-step "Hello, World!" example for both MS-DOS and Linux environments.

· 3 min read
View raw
Christophe
Markdown, WSL and Docker lover ~ Insatiable curious.
Cet article existe aussi en français — lire la version française.

This article is over a year old but was reviewed on July 30, 2026 — the content is still accurate.

Play with Docker and Assembly programming language

⚡
TL;DR

This article revives 1990s x86 Assembly nostalgia by assembling and running a "Hello, World!" .asm file with zero local install, using the esolang/x86asm-nasm Docker image from both a DOS/PowerShell console (%CD%) and Linux (${PWD}).

When I was younger than today, during my studies, I was playing with the x86 Assembly language on my 386DX40 computer; this was in the years 1993-1995. The beginning of Windows 3.1 that I did not like. If someone had asked me if graphical interfaces would be successful, I would have said no, of course not.

I remember that I wrote a resident program (TSR which stands for Terminate and Stay Resident) which, once loaded into memory, monitored the keyboard and recorded the keys that had been pressed in a file on the hard disk. Yes, it was a password stealer. Just for fun and, above all, for the challenge of it.

And now, in 2023, I was wondering if it was still possible to run .asm files on my computer. It was an excellent reason for this article.

The same nostalgia trip, one language later: Play with Docker and Pascal, where I compile Turbo Pascal sources I published thirty years ago.

By searching on Docker Hub, I have found this image: https://hub.docker.com/r/esolang/x86asm-nasm

Let's play in MS-DOS​

Let's test our Docker image in DOS this time. Please start a DOS console and run mkdir C:\tmp\assembly && cd C:\tmp\assembly to create a folder called assembly in your DOS environment and enter it.

Please create a new file called Hello.asm with this content:

; Our data section (i.e. our variables)
SECTION .data
; Our null terminated string
hello: db 'Hello, World! This message comes from Docker.', 0
; Our entry point
SECTION .text
global _start
_start:
mov edx, 45 ; 45 is the length of our "hello" message
mov ecx, hello ; The name of our variable is "hello"
mov ebx, 1 ; We'll write to stdout
mov eax, 4 ; System call number (sys_write)
int 0x80 ; Triggers software interrupt 80
mov ebx, 0 ; Next three lines are equivalent to exit 0
mov eax, 1
int 0x80

This is a minimal x86 assembly program that prints 'Hello, World! This message comes from Docker.' to the console, then exits cleanly. It uses Linux system calls to write to standard output and terminate the program.

To run the script, just call Docker, like this:

>Powershell

Of course you can play under Linux

Just replace %CD% by ${PWD} and the instruction will be recognized by Linux: docker run --rm -v ${PWD}:/code -w /code esolang/x86asm-nasm x86asm-nasm hello.asm

Same idea, different language: I've also played with Pascal, Python, and Java using this same "zero local install" Docker approach.


Was this article helpful?
Did you try the steps in this article?