A custom CPU emulator with assembler/disassembler for the Dedinsky system programming course.
mkdir build && cd build
cmake ..
cd ..
cmake --build build --preset debug # Debug build
cmake --build build --preset release # Release build# 1. Assemble (.myasm → .bin)
./assembler program.myasm program.bin
# 2. Execute
./cpu_emulator program.bin
# 3. Disassemble (.bin → .myasm)
./disassembler program.bin
./disassembler program.bin output.myasm # Save to fileExecutables are in build/debug/ or build/release/.
- Only hexadecimal:
10means 0x10 (16 in decimal) - No 0x prefix:
0x10will cause an error - Valid examples:
A,FF,100
:main ; Label definition
baw :main ; Jump to label
cfn :function ; Call function by labelmov x1, A ; Load 0x0A into register x1mov dst, src- Move valueinp reg- Read hex from stdinout reg- Write hex to stdouthlt- Stop execution
add dst, a, b- Additionsub dst, a, b- Subtractionmul dst, a, b- Multiplicationdiv dst, a, b- Divisionsqr dst, src- Square root
baw addr- Branch alwaysbeq/beq/bgt/blt/bge/ble a, b, addr- Conditional branchescfn addr- Call functionret- Return
str val, *addr- Store to stackldr reg, *addr- Load from stack
| Prefix | Meaning | Example |
|---|---|---|
x |
Register | x1 = register 1 |
* |
Stack address | *100 = address 0x100 |
*x |
Register indirect | *x1 = address in register 1 |
x0-xf: General purpose (16 registers)x10: Program counter (rpc)x11: Base pointer (rbp)x12: Cycle counter (rcc)
Check examples/ directory:
fibonacci.myasmiterative_factorial.myasmrecursive_factorial.myasmstack_arithmetic.myasm
cpu_backend/ # Core emulator code
├── src/assembler/ # Assembler
├── src/cpu_emulator/ # CPU core
└── src/disassembler/ # Disassembler
examples/ # Sample programs
vendor/ # Dependencies (stack, exceptions)
Note: Numbers are always hexadecimal. 10 = 0x10 (16 decimal). 0x10 will cause an error.