Files
8086-rs/README.md
2025-05-28 16:00:18 +09:00

74 lines
3.1 KiB
Markdown

# 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](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.