The Zachtronics game "Exapunks" is amazing. Its plot is a standard cyberpunk story with body modifications and underground networks of outlaws working against corrupt corporations.
Its gameplay is that you write (an extremely simple) assembly bytecode for virtual machines called the "Exa"s, those virtual machines then infiltrate computer systems across the network and perform your program there. The whole thing is visualised as tiny little robotic virus-like creatures, representing the malicious scripts you write, hopping around in an arena representing the network they haunt.
Aside from the amazing and nostalgic story and the obviously educational value of teaching a player the bare basics of assembly programming, there are more subtle educational content being sneaked into the experience. Off the top of my head:
1) The Exa is extremely primitive, it has a single general purpose 4-digit-wide register that can hold decimal numbers from -9999 to 9999 (and occasionally strings), and another one mostly like it but test-and-jump instructions additionally treat it as an implicit second operand, that's it. No stack, no procedures, no nothing. Just 2 registers, and a very simple set of 2 dozen or so instructions. Oh and there's also a limit on the code size, it varies on each level but it's about 100-150 instructions.
2) But the Exa is Turing-complete, because it has a special instruction MAKE that creates a file, files are infinite length comma-seperated list of values, you can only write to it by writing to a special register on the Exa. Juggling values between files and registers is thrilling mental gymnastics.
3) Exas can fork, this is the primary mechanism that gets around code size limitations. Forking works just like OS processes, a new copy of the Exa with the same code is created and the child jumps to a label while the parent falls through the code. I learned and internalised all of this before I knew what 'Process' in the OS sense even means, that's how beautiful this game is. There are even a mechanism for communication between Exas (i.e. IPC), complete with rules about what happens if an Exa writes to the network register and nobody reads it or vice versa.
4) Sometimes you manipulate external devices (neurones, ATM machines, satellite dishes, Etc...) by writing to special registers, just like you manipulate files by writing to a special register, this is yet another sneaky educational bit: the Everything-is-a-file of Linux and Unix OSes, the interface for hardware mimics the interface for files and networks.
Also checkout other Zachtronics games like kohctpyktop, TIS-100, and shenzenIO. Every one of them has something awesome to teach you, but it's Exapunks that burned itself deep inside my brain and heart.