3.1 KiB
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 1.x.
It includes:
- 📦 a.out Parser: Parses legacy MINIX 1.x 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 1.x 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 2>&1 | less
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] <COMMAND>
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> Path of the binary
-d, --dump Dump progress of disassembly, in case of encountering an error
-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 overview of all Opcode variants used in conjunction with this 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.