7 ms·
The smallest Hello World program
- mrfinn 2y agoThese challenges are funny - they remind me of the old days. Back in the DOS/Windows days, we used to have the .com format, which was perfect for tiny programs. One could even write a program of less than 10 bytes that could actually do something! We've come a long way since then, and is like, at some point, nobody cared about optimizing executable size anymore
- xpasky 2y agoJMP FFFF:0000
- mrfinn 2y agoINT 13h... uff chills
- secondcoming 2y agoPeople in the embedded space care. Symbian OS was compiled for small size, only certain parts were allowed use O3, such as the jpeg decoder.
- hinkley 2y agoI learned to write COM programs at some point but quickly unlearned it. There were some spots where you can use them and not .bat files, but outside of that it’s a lot.
- theandrewbailey 2y agoSome people care about executable size, (mostly) everyone else ships Electron apps.
- ramon156 2y agoTell it to my boss, he wants his app last week.
- smokel 2y agodebug -a 100 178A:0100 int 19 178A:0102 -r cx CX 0000 :2 -n reboot.com -w Writing 00002 bytes -q
- mrfinn 2y agoGreat example, a two bytes reboot utility. From the times when we could turn off the computer with a push of a button without fearing a global catastrophe...
- dim13 2y agoSome more: Quick'n'dirty: .model small .code org 100h start: int 19h ; Bootstrap loader end start More "correct": .model small .code org 100h start: db 0EAh ; Jump to Power On Self Test - Cold Boot dw 0,0FFFFh end start Even more "correct": .model small .code org 100h start: mov ah,0Dh int 21h ; DOS Services ah=function 0Dh ; flush disk buffers to disk sti ; Enable interrupts hlt ; Halt processor mov al,0FEh out 64h,al ; port 64h, kybd cntrlr functn ; al = 0FEh, pulse CPU reset end start
- xpasky 2y agoNow, can we make it even smaller applying https://nathanotterness.com/2021/10/tiny_elf_modernized.html https://nathanotterness.com/2021/10/tiny_elf_modernized.html ? We shouldn't need the full ELF header...
- xpasky 2y agoOh it has been done: https://nathanotterness.com/2021/10/hello_105.asm https://nathanotterness.com/2021/10/hello_105.asm
- gr33kdude 2y agoLinking a similar, very popular past example of this: Teensy: https://www.muppetlabs.com/~breadbox/software/tiny/teensy.html https://www.muppetlabs.com/~breadbox/software/tiny/teensy.ht...
- BergAndCo 2y agoThank you, I knew I had read somewhere someone put the program in the ELF header itself and got it down to 45 bytes, this is that exact post.
- bd01 2y agoThis is pretty bad. Let's start with the very first instruction: mov rax, 1 An actual "mov rax, 1" would assemble to 48 B8 01 00 00 00 00 00 00 00, a whopping TEN bytes. nasm will optimize this to the equivalent "mov eax, 1", that's 6 bytes, but still: xor eax, eax ; 2 bytes inc eax ; 2 bytes would be much smaller. Second line: mov rdi, 1 You already have the value 1 in eax, so a "mov edi, eax" (two bytes) would suffice. Etc. etc.
- xpasky 2y agopush 1 pop rax is even shorter (credit: https://old.reddit.com/r/programming/comments/q6mnz1/what_is_the_smallest_linux_elf_executable_2021/hgdpee0/ https://old.reddit.com/r/programming/comments/q6mnz1/what_is...)
- musicale 2y agoI feel like I shouldn't love x86 encoding, but there is something charming about this. Probably echoing its 8-bit predecessors. It seems like it's designed for tiny memory environments (embedded, bootstrapping, etc.) where you don't mind taking a hit for memory access.
- rep_lodsb 2y agoLinux initializes all general purpose registers to zero. It's not documented AFAIK, but should be reliable - it has to init them to some value anyway to avoid leaking kernel state. So you can get away with: mov al,1 ;write mov edi,eax ;handle=stdout mov esi,msg ;assumes load address below 4G mov dl,msg.len syscall mov al,60 ;assuming syscall succeeded, EAX was bytes written xor edi,edi syscall The load address stays constant unless there's some magic GNU extension header to enable ASLR. If we could get the code loaded below 64K, we could save another byte by using SI instead of ESI; however this doesn't work by default, you'd have to run 'echo 0 > /proc/sys/vm/mmap_min_addr' as root first.
- bd01 2y agoInitial register state is documented to be undefined except for rbp, rsp and rdx [1]. Can you say for certain that no other Linux version ever used GPRs to pass something else? [1] System V ABI, page 29 (last line) and 30, https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf
- smokel 2y agoMy favorite language for implementing short Hello World programs in is HQ9+ [1]. Joking aside, this page [2] used to be a great tutorial on writing small ELF binaries, but I'm not sure whether it will still work in 64-bit land. It proved very helpful for writing a 4K intro back in 1999. [1] https://esolangs.org/wiki/HQ9%2B https://esolangs.org/wiki/HQ9%2B [2] https://www.muppetlabs.com/~breadbox/software/tiny/teensy.html https://www.muppetlabs.com/~breadbox/software/tiny/teensy.ht...
- whynotmaybe 2y agoCould a script be a program? Because it would be much smaller in a bat file than contains : echo Hello World!
- hinkley 2y agoInclude the shebang but it’s still crazy how big minimal programs are.
- theandrewbailey 2y agoFor the purposes of this challenge, no. > Let’s first establish some rules for our ‘Hello World’ program: > It should be able to execute directly without passing to any other programs first (so no decompression) > It should be a ‘proper‘ executable binary according to the spec
- __m 2y agophp would be just Hello World
- oneshtein 2y agoThe smallest "hello, world" programs in Rust I did for Arduino are 294 bytes for blink and 388 bytes for hw.
- Tepix 2y agoHere's a tiny DOS COM file that does it in 18 bytes: ;; 18 bytes DB 'HELLO_WOIY<$' ; executes as machine code, returning SP to original position without overwriting return address mov dx, si ; mov dx,0100h MS-DOS (all versions), FreeDOS 1.0, many other DOSes xchg ax, bp ; mov ah,9 MS-DOS 4.0 and later, and FreeDOS 1.0 int 21h ret (credits: https://stackoverflow.com/questions/72635031/assembly-hello-world-execution-file-less-than-20-bytes https://stackoverflow.com/questions/72635031/assembly-hello-...)
- rep_lodsb 2y agoWell, it prints something that is the same length as the correct message at least.
- deleted 2y ago[deleted]
- musicale 2y agoCOM files for CP/M and DOS really are a no-nonsense executable format. I'm a bit disappointed that Linux (or BSD, macOS, etc.) doesn't support them (or similar) out of the box, though Windows will sort of run them via ntvdm.
- deleted 2y ago[deleted]
- 5- 2y agohere's an 80 byte x86_64 linux 'hello world' (okay, not 'Hello world!'). convert to binary with xxd -r -p: 7f454c46488d3537000000ffc7b20eeb03003e00 b001eb1a01000000050000001800000000000000 1800000005000000b03c0f05ebfa380001006865 6c6c0000010068656c6c00006f20776f726c640a i'm sure this can be improved -- but i could never get any x86_64 linux elf to under 80 bytes. see if you can fit the exclamation point still.
- michidk 2y agoYeah I thought sth like this is possible, but (correct me if I'm wrong) this (ab)uses the ELF header and punts data in there, which goes against my requirement > It should be a ‘proper‘ executable binary according to the spec
- 5- 2y agoyes, this one conforms to 'whatever linux agrees to exec(2)', which apparently is a lot that is out of spec.
- Multicomp 2y ago129 byes...supposedly that's 2 punch cards according to Dr gpt. Small program!
- musicale 2y agoI realize TFA is trying for object code, but for source code, QuickBASIC (and its successors) isn't bad: ? "hello, world!" PILOT eliminates the quotes: T:hello, world! Of course a typical REPL (Python, JavaScript, Lisp, etc.) will print out something similar (but often quoted) if you just type the quoted string. And I'm sure there is already some language (call it HELLO) which simply prints "hello, world!" for an empty program.
- charlieyu1 2y agoThere are probably some golfing languages out there where an empty program outputs Hello World.
- deleted 2y ago[deleted]
- musicale 2y agoI'm certain there is, but I don't have a reference for it yet other than my imaginary HELLO (Highly Efficient Limited Line Output) language.
- fjfaase 2y agoWould it be fair to name the program 'Hello World!' and than use argv[0], which is on the stack, to print out 'Hello World!'?
- michidk 2y agoHehe a nice idea. But then it would not always print Hello World and you cannot execute it directly.