# minix-8086-rs minix-8086-rs is a Rust-based toolchain for analyzing and interpreting 16-bit 8086 binaries, made with the intention of interpreting binaries compiled for MINIX. It includes: - 📦 a.out Parser: Parses legacy MINIX executables. - 🛠 8086 Disassembler: Parses 16-bit instructions into an IR and prints them in a `objdump(1)`-style fashion. - 💻 8086 Interpreter: Interprets the 8086 instructions, i.e., the MINIX binary. ## Usage To compile and run the tool, use Cargo: ``` cargo build --release ``` Or run it directly: ``` cargo run -- --help ``` Run with debug output: ``` RUST_LOG=debug cargo run -- interpret -p ./a.out ``` CLI Options: ``` $ cargo run -- --help Simple program to disassemble and interpret 8086 a.out compilates, e.g. such for MINIX Usage: minix-8086-rs [OPTIONS] Commands: disasm Disassemble the binary into 8086 instructions interpret Interpret the 8086 instructions help Print this message or the help of the given subcommand(s) Options: -p, --path Path of the binary -h, --help Print help -V, --version Print version ``` ## Status This project is under active development and primarily used by me to explore some Intel disassembly and learn some more Rust. Expect bugs and some missing features. I mainly test with 'official' binaries from the MINIX source tree. ## Documentation The documentation of the project itself can be accessed by using `cargo doc`. ``` $ cargo doc $ firefox target/doc/minix_8086_rs/index.html ``` For the implementation of all instructions I used the Intel "8086 16-BIT HMOS MICROPROCESSOR" Spec, as well as [this](http://www.mlsite.net/8086/8086_table.txt) overview of all Opcode variants used in conjunction with [this](http://www.mlsite.net/8086/) decoding matrix. ## FAQ #### Why hassle with interpretation and not just emulate 8086? For once, this project stemmed from a university exercise about the 8086 instruction set and disassembly. An interpreter was the logical (?) next step. Maybe I add 8086 emulation some day. #### Why no `nom`? There is no real reason, I just wanted to try to implement most parts myself, even if it meant more boilerplate code. I used `nom` extensivly in the past and I just wanted to see what it would be like without that crate. In hindsight, using `nom` would have been the cleaner option, but hey, something I only learned by not using `nom` for once.