Executable Emoji

MBCook2 pts0 comments

Executable Emoji

Skip to main content

Executable Emoji

Get link

Facebook

Pinterest

Email

Other Apps

August 06, 2026

Warning: This page contains hundreds of emoji. If you're using a screen reader, be sure it doesn't read them all out loud.

A whole bunch of emoji. What could they mean?

This particular post comes out of left field a bit. I was playing around with a web application I had made - an online disassembler for the x86 - when I noticed that emoji were being encoded into the url.<br>I pasted a goat emoji, ๐Ÿ and I noticed the encoding %F0%9F%90%90.<br>Now, if you're familiar with x86 assembly language at all, hexadecimal 90h is probably familiar to you. It's the opcode for a null operation or NOP.<br>I had a brief nerd chuckle over the thought that goats were the NOPs of emoji, but then I got curious. F0h on the 8088 is the LOCKprefix. This prefix is generally used to coordinate exclusive bus access with a coprocessor such as the 8087, but otherwise does nothing and is ignored. That leaves us with 9Fh.<br>9Fh is LAHF.<br>The entire goat emoji is valid 8088 machine code, a sequence that reads

LOCK LAHF<br>NOP<br>NOP

As it turns out, the vast majority of emoji graphemes, as they are called, start with the sequence F09F. A dim little light bulb started to flicker above my head. Could you actually write an 8088 program using nothing but displayable emoji?<br>The idea is not without precedent. It has been well-established that executables can be generated with only printable ASCII characters - the most famous example probably being the EICAR test file, an ASCII string that is also a valid DOS executable that prints "EICAR-STANDARD-ANTIVIRUS-TEST-FILE!" and exits.<br>Other small ASCII programs were printed in magazines or distributed in other ways, such as the tiny terminal utility TCOM, the entire source of which is reproduced below:

XPHPD[0GG0G,0G51G31GB'(G+(G:u'0g?(G>(GE1G@arwIV_F*=US@>1|_,5wXNg-7muTu(4<br>1m0ss1k260s@3G1g360@3G0i7t2g3A1g350@3G2E1=0C1g350@3T2M0^\1g3>0@3T=1s2g0T<br>1g3;0@3ToN2g391g0t@3G0^F1k0s2?0@3T4<br>This is an interesting "emergency terminal" solution: if someone had no other means of loading an executable onto a computer system, it could simply be entered in via the keyboard.<br>It surprises me that the idea of directly executing emoji has apparently never been explored.<br>Hello (World)!<br>Of course, the first thing to do is attempt Hello World! in emoji. For space reasons and partly due to the pain of doing any sort of arithmetic in emoji, we will only print the string HELLO.<br>Here is the full program:<br>๐Ÿธโ˜บ๏ธ๐Ÿฐ๐ŸŽโ™๐Ÿ—ƒ๏ธ๐Ÿงฏ๐Ÿงฏ๐Ÿงฏ๐Ÿฎ๐Ÿ’—๐Ÿฆฎ๐Ÿชโ™๐Ÿฐ๐Ÿน๐Ÿ—ƒ๏ธ๐Ÿงฏ๐Ÿงฏ๐Ÿงฏ๐Ÿงฏ๐Ÿ’—๐Ÿช—๐Ÿงฏ๐Ÿ˜—๐Ÿงฎ๐Ÿซช๐Ÿ˜—๐Ÿงฎ๐Ÿ˜—๐Ÿฎ๐Ÿ˜ช๐Ÿ˜”โญ<br>Pasted into a text editor and saved as UTF-8, no BOM, with a .COM file extension, the result should be 141 bytes with an MD5 sum of 0a5c91475ca2de33e36aacc2f0b7b840.<br>The disassembly of the entire program can be viewed here.<br>Several emoji here may display as tofu, depending on your browser and what year you are reading this article.<br>๐Ÿช is the shovel emoji, introduced in Unicode 16.0 in 2024. These glyphs still take time to trickle down into font updates.<br>๐Ÿซช is the "Distorted Face" emoji and is brand new in Unicode 17.0, approved in 2025.<br>In theory, it should be possible to copy the relevant tofu character and preserve the representational bytes, but some operating systems and programs seem to struggle with the byte-preserving concept.<br>This program relies on a few undocumented 8088 aliases, and so requires a fairly accurate 8088 core to execute successfully. Let's see what it does in DOSBox-X with cpu cputype=8086:

The "Hello (World!)" program executing in DosBox-X<br>Note the program starts with ๐Ÿธโ˜บ๏ธ. This sequence does some important setup and explains how we get a pointer to video memory. These emoji represent the byte sequence F09F90B8E298BAEFB88F.

00000000 F0 9F lahf<br>00000002 90 nop<br>00000003 B8 E2 98 mov ax,98E2h<br>00000006 BA EF B8 mov dx,B8EFh<br>00000009 8F db 0x8F

B8EFh is still within the base B800 text mode video segment, approximately 3,824 bytes into the screen, which explains why our text appears in the bottom-right corner of the screen. Beggars can't be choosers, though, so we'll just pretend our text positioning was entirely intentional.

The ๐Ÿ’— emoji, F09F9297, is what gets our screen pointer into DI.

0000012C F0 9F lahf<br>0000012E 92 xchg dx,ax<br>0000012F 97 xchg di,ax

The letters are then awkwardly synthesized, starting with H.

๐Ÿ—ƒ๏ธ, F09F9783EFB88F, comes in clutch here:

00000146 83 EF B8 sub di,FFB8h

Subtraction by FFB8h is equivalent to addition by 48h. What's H's ASCII hex code? 48h. Neat.

The rest of the letters are awkwardly synthesized one by one. L can, of course, be repeated. You'll note one of the Ls is green. This is caused by allowing one of the LAHF instructions to overwrite AH. It just so happens that the contents of the flag register represent a visible character attribute byte - in this case, green. The attribute could be reset at the expense of a few more bytes, but I kind of like the mismatch as a tiny hint of the...

emoji program executable lahf screen sequence

Related Articles