HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
xoreaxeaxeax
movfuscator
C2015–2026
xoreaxeaxeax / movfuscator

movfuscator

The single instruction C compiler

96Distinct people
103Mentions
0Explicit recommenders
10.6KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

The single instruction C compiler

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

No recommendation phrase was found in the indexed comments.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

Mentioned in the same Hacker News threads. That is not proof they are substitutes.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 3:56:07 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year103 dated mentions

Observed mentions: 2015-06-20 22:52:21 UTC to 2026-03-01 11:57:41 UTC.

0510152015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 5 mentions; 3 submissions, 2 comments20152016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 14 mentions; 4 submissions, 10 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 8 mentions; 1 submissions, 7 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 13 mentions; 2 submissions, 11 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 8 mentions; 1 submissions, 7 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 12 mentions; 1 submissions, 11 comments20202021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 11 mentions; 3 submissions, 8 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 9 mentions; 0 submissions, 9 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 12 mentions; 2 submissions, 10 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 8 mentions; 2 submissions, 6 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments. Incomplete calendar period.2026*

* An incomplete calendar period is marked with an outlined bar. Its count is not directly comparable with a full period.

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC532
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC14410
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC817
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC13211
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC817
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC12111
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC1138
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC909
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC12210
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC202
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC826
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC101

From the project README

An excerpt from the repository, fetched Nov 13, 2026.

Read the project’s introduction
___ ___ ___ ___ ___ ___ ___ ___ ___ /\ \ /\ \ ___ /\__\ /\ \ /\__\ /\__\ /\ \ /\ \ /\ \ . |::\ \ /::\ \ /\ \ /:/ _/_ \:\ \ /:/ _/_ /:/ / /::\ \ ___ /::\ \ /::\ \ . |:::\ \:/\:\ \ \:\ \:/ /\__\ \:\ \:/ /\ \:/ / /:/\:\ \/\__\:/\:\ \:/\:\__\ . __|:|\:\ \ \:\ \ \:\ \ /:/ / \:\ \ /::\ \ / _:/ /::\ \/ // \:\ \ /:/ / /::::|_\:\__\/ \:\__\ \:\__\:/ / \ \:\__\:/\:\__\/ /\__\:/\:\__\_//__/ \:\__\:/__/___ \:\~~\ \/__/\ /:/ / |:| |/ /\ \ /:/ // /:/ /\ /:/ // \/__/ \\ \ /:/ /::::/ / \:\ \ \:\ /:/ / \|:| |__/\:\ /:/ // /:/ / /:/ //__/:/\:\ \\ /:/ //~~/~~~~ \:\ \ \:\/:/ /\__|:|__| \ \:\/:/ //_/:/ /:\/:/ /:\ \/__\:\ \\/:/ /:\~~\ . \:\__\ \::/ /\::::/__/:\__\ \::/ / /:/ / \::/ / \:\__\ \:\__\:/ / \:\__\ . \/__/ \/__/ ~~~~ \/__/ \/__/ \/__/ \/__/ \/__/ \/__/ __/ \/__/ 2 M/o/Vfuscator2 github.com/xoreaxeaxeax/movfuscator :: the single instruction C compiler chris domas @xoreaxeaxeax Overview The M/o/Vfuscator (short 'o', sounds like "mobfuscator") compiles programs into "mov" instructions, and only "mov" instructions. Arithmetic, comparisons, jumps, function calls, and everything else a program needs are all performed through mov operations; there is no self-modifying code, no transport-triggered calculation, and no other form of non-mov cheating. The basic effects of the process can be seen in overview, which illustates compiling a simple prime number function with gcc and the M/o/Vfuscator. Assembly: GCC M/o/Vfuscator Control flow graphs: GCC M/o/Vfuscator In action: movcc prime.c -o prime Of course, as a complete C compiler, it is not limited to simple programs: movcc nibbles.c -o nibbles -lncurses The compiler currently targets the C programming language and x86 processor architecture, but is easily adaptable to other languages and architectures. Building The M/o/Vfuscator uses LCC as the compiler frontend. The included build script will automatically download LCC, configure it for the mov backend, and build the M/o/Vfuscator tool. If you are building on a 64 bit system, ensure that you have a 32 bit libc available (for example, 'apt-get install libc6-dev-i386' or 'yum install glibc-devel.i686'). git clone https://github.com/xoreaxeaxeax/movfuscator cd movfuscator ./build.sh sudo ./install.sh If you have trouble building LCC, you can get more details on the LCC build process at: https://drh.github.io/lcc/current/doc/install.html Testing Check that the build was successful with the check script. This will automatically download an open source AES implementation, compile it to mov instructions, objdump the result, and run the program. ./check.sh Usage Compile programs as you would with any traditional C compiler: movcc example.c -o example Flags Flags are passed to the compiler proper via -Wfflag, e.g. -Wf--no-mov-id --mov-id Add reference instructions for each basic block to assist debugging. --no-mov-id Do not add reference instructions. This is the default. --mov-flow Use mov instructions in implementing control flow. This is the default. --no-mov-flow Use jmp instructions in implementing control flow. This will substantially speed up execution in larger projects. If using floating point operations with this flag, link to softfloat*_cf.o instead of the fully obfuscated libraries. --mov-extern Use mov instructions to implement external function calls. This is the default. --no-mov-extern Use jmp instructions to implement external function calls. This is useful for debugging. --mov-loop Use mov instructions to implement the primary execution loop. This is the default. --no-mov-loop Use jmp instructions to implement the primary execution loop. This is useful for debugging. --crt0 Build the M/o/Vfuscator crt0 library (_start routines). --crtf Build the M/o/Vfuscator crtf library (primary execution loop routines). --crtd Build the M/o/Vfuscator crtd library (data tables). --crt Same as --crt0 --crtf --crtd. Floats The M/o/Vfuscator contains a complete mov-only floating point emulator. Since it is approximately 500,000 instructions, you must explicitly link to it if you need it. Use the smaller softfloat32.o if you only use floats, softfloat64.o if you need floats and doubles, and softfloatfull.o for a full IEEE floating point emulator. movcc your_code.c movfuscator/lib/softfloat32.o Recommendations Due to the lookup tables used for arithmetic, the symbol tables in the compiled binary can be extremely large. Stripping symbols with the -s flag can cut the final binary size by half. movcc example.c -s Warnings You may occassionally run into ABI conflicts when calling into libraries compiled with other compilers. These are relatively rare, but do occassionally pop up. Watch out for: Passing a pointer to a callback function into a library. The M/o/Vfuscator will clobber registers the library was expecting to have preserved. Using the long long type. The M/o/Vfuscator uses a 32 bit long long; your library may be expecting 64 bits. Such ABI issues are relatively rare; they can be roughly fixed with some coding caution, or more robustly fixed by recompiling your libraries with the M/o/Vfuscator. LCC is a C89 compiler. If you try to compile C99 code, you will get errors. Don't use C99 features like bool, for (int ...), etc. Don't declare variables in the middle of blocks. To generate code correctly, the M/o/Vfuscator must be able to determine when a call is being made to a shared library. If a function is used before it is declared, this determination may be incorrect. If your executable hangs, it may be because a function proto
Read the full README on GitHub

What Hacker News says

103 sources
You're missing the point. All instructions can be simplified to short integer operations, then all integer operations are just networks of gates, then all gates can be replaced with AND/OR/NOT, or even just NAND. That's why you can SAT solve program equivalence. See SMT2 programs using BV theory for example. Also of course all instructions are MOV anyway. https://github.com/xoreaxeaxeax/movfuscator
In FFmpeg devs boast of another 100x leap thanks to handwritten assembly code
Good question! The TL;DR as I understand it is that it won't matter too much. For example, the self-hosted x86_64 backend (which is coincidentally becoming default for debugging on linux right now - https://github.com/ziglang/zig/pull/24072) has full support for most (all?) builtins. I don't think that we need to worry about that. It's an interesting question about how Zig will handle additional builtins and data representations. The current way I understand it is that there's an additional opt-in translation layer that converts unsupported/complicated IR to IR which the backend can handle. This is referred to as the compiler's "Legalize" stage. It should help to reduce this issue, and perhaps even make backends like https://github.com/xoreaxeaxeax/movfuscator possible :)
In Low-Level Optimization with Zig
?? 3d snap shot of Meh (multi 2.71828 huygens[-2][-1]). Unless gravity of situation is to much, then (S)urreal[0].(a)nimated.(T)uring[1] (t)ests / (a)nimated (C)omplex-number (T)uring (t)ests might be the way to go. aka Don't have to worry about bricking things[2] because of limited data and need to apply a t-test[3]. May need metaheuristics to analyze. To much 9.81 might result in visual wrinkles[4] and IRL mov obscuator[5] --------- [-2]: Huygen's theory of light & wavefronts : https://www.youtube.com/watch?v=FpTFU4Yh7gQ [-1]: What is sound? : https://www.youtube.com/watch?v=IhzZAoSYDLE [0] : https://en.wikipedia.org/wiki/Surreal_number# [1] : physical turing test... : https://news.ycombinator.com/item?id=43938386 [2] : Brickognize .... : https://www.mdpi.com/1424-8220/23/4/1898 [3] : https://www.jmp.com/en/statistics-knowledge-portal/
Read the rest
In How do you print a 3D photo? Gaussian Splats in resin [video]
For anyone else who immediately thought, "I've gotta try that!" and hit compilation errors: there appears to be a more maintained fork at [0]. And if you're on a 64-bit system, you'll want to make sure it finds the 32-bit libc and libm binaries (see [1]). On Arch, the following worked for me: ./build/movcc -L/usr/lib32 test.c [0]: https://github.com/xoreaxeaxeax/movfuscator [1]: https://github.com/xoreaxeaxeax/movfuscator/issues/39
In M/o/Vfuscator: A single instruction C compiler

Showing the 15 most recent of 103 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.