https://github.com/kubkon/zig-dis-x86_64
x86_64 disassembler library written in Zig
https://github.com/kubkon/zig-dis-x86_64
Last synced: 9 months ago
JSON representation
x86_64 disassembler library written in Zig
- Host: GitHub
- URL: https://github.com/kubkon/zig-dis-x86_64
- Owner: kubkon
- License: mit
- Created: 2022-05-30T08:19:24.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2025-07-21T14:55:19.000Z (11 months ago)
- Last Synced: 2025-07-21T16:43:45.437Z (11 months ago)
- Language: Zig
- Size: 328 KB
- Stars: 39
- Watchers: 6
- Forks: 4
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-zig - zig-dis-x86_64🗒️x86_64 disassembler library written in Zig
README
# zig-dis-x86_64
x86_64 disassembler library written in Zig
## What is it?
You can use this library to disassemble and encode x86_64 machine code.
## Why is it?
I needed a simple disassembler for linker optimisations in `zig ld` for x86_64.
## Basic usage
Disassembling input byte buffer:
```zig
const std = @import("std");
const Disassembler = @import("dis_x86_64").Disassembler;
var disassembler = Disassembler.init(&.{
0x40, 0xb7, 0x10, // mov dil, 0x10
0x48, 0x8b, 0xd8, // mov rbx, rax
});
var text = std.ArrayList(u8).init(gpa);
defer text.deinit();
while (try disassembler.next()) |inst| {
try text.writer().print("{}\n", .{inst});
}
try std.testing.expectEqualStrings(
\\mov dil, 0x10
\\mov rbx, rax
, text.items);
```
Encoding instructions back to machine code:
```zig
const std = @import("std");
const Instruction = @import("dis_x86_64").Instruction;
const RegisterOrMemory = @import("dis_x86_64").RegisterOrMemory;
var code = std.ArrayList(u8).init(gpa);
defer code.deinit();
const inst = Instruction{
.tag = .mov,
.enc = .mi,
.data = Instruction.Data.mi(RegisterOrMemory.reg(.rbx), 0x4),
};
try inst.encode(code.writer());
try std.testing.expectEqualSlices(u8, "\x48\xc7\xc3\x04\x00\x00\x00", code.items);
```