X86/X64 汇编器
强类型 · 面向对象 · 零依赖核心 · 现代化设计
用于 x86 和 x86-64 架构的高性能汇编器库,采用 Rust 的类型系统提供编译时安全保障,完全面向对象的设计理念让汇编编程变得直观且安全,现代化的 API 设计让底层编程变得优雅而高效。
🚀 快速开始
基本示例
创建简单的汇编程序
use x86_64_assembler::{X86_64Assembler, instruction::{Instruction, Operand, Register}};
use gaia_types::helpers::Architecture;
let assembler = X86_64Assembler::new(Architecture::X86_64)?;
let instructions = vec![
Instruction::Push { op: Operand::reg(Register::Rbp) },
Instruction::Mov {
dst: Operand::reg(Register::Rbp),
src: Operand::reg(Register::Rsp)
},
Instruction::Mov {
dst: Operand::reg(Register::Eax),
src: Operand::Imm { value: 0, size: 32 }
},
Instruction::Pop { dst: Operand::reg(Register::Rbp) },
Instruction::Ret,
];
let mut machine_code = Vec::new();
for instruction in &instructions {
let bytes = assembler.encode(instruction)?;
machine_code.extend(bytes);
}
println!("生成的机器码: {:?}", machine_code);
编码和解码指令
use x86_64_assembler::{X86_64Assembler, instruction::{Instruction, Operand, Register}};
use gaia_types::helpers::Architecture;
let assembler = X86_64Assembler::new(Architecture::X86_64)?;
let mov_instruction = Instruction::Mov {
dst: Operand::reg(Register::Eax),
src: Operand::Imm { value: 42, size: 32 }
};
let encoded = assembler.encode(&mov_instruction)?;
println!("编码结果: {:?}", encoded);
let decoded = assembler.decode(&encoded)?;
println!("解码结果: {:?}", decoded);
✨ 核心特性
🔒 强类型安全
利用 Rust 强大的类型系统,在编译时捕获常见的汇编编程错误:
use x86_64_assembler::instruction::{Instruction, Operand, Register};
let valid_mov = Instruction::Mov {
dst: Operand::Reg(Register::Eax), src: Operand::Imm { value: 42, size: 32 }, };
🏗️ 面向对象设计
采用现代面向对象设计模式,提供直观易用的 API:
use x86_64_assembler::X86_64Assembler;
use gaia_types::helpers::Architecture;
let mut assembler = X86_64Assembler::new(Architecture::X86_64)?;
assembler.set_architecture(Architecture::X86)?;
let bytes = assembler.encode(&instruction)?;
let instructions = assembler.decode(&machine_code)?;
⚡ 零成本抽象
Rust 的零成本抽象确保类型安全不会带来运行时开销:
match instruction {
Instruction::Mov { dst, src } => ,
Instruction::Push { op } => ,
Instruction::Pop { dst } => ,
}
🛡️ 内存安全
完全内存安全的汇编编程,无需担心缓冲区溢出或野指针:
let instructions = vec![
Instruction::Push { op: Operand::Reg(Register::Rax) },
Instruction::Mov { dst: Operand::Reg(Register::Eax), src: Operand::Imm { value: 0, size: 32 } },
Instruction::Pop { dst: Operand::Reg(Register::Rax) },
];
let bytes = assembler.encode(&instructions[0])?;
📖 API 参考
核心类型和结构
X86_64Assembler - 强类型汇编器核心
采用面向对象设计模式的主要汇编器结构体:
pub struct X86_64Assembler {
architecture: Architecture,
}
Instruction - 类型安全指令枚举
强类型设计的指令枚举,每个变体都有严格的操作数约束:
pub enum Instruction {
Mov { dst: Operand, src: Operand },
Push { op: Operand },
Pop { dst: Operand },
Add { dst: Operand, src: Operand },
Sub { dst: Operand, src: Operand },
Ret,
Call { target: Operand },
Lea { dst: Register, displacement: i32, rip_relative: bool },
Nop,
}
impl Instruction {
pub fn validate(&self) -> Result<()> {
match self {
Instruction::Mov { dst, src } => {
dst.validate_size(src.get_size())?;
Ok(())
}
Instruction::Push { op } => {
op.validate_push_operand()?;
Ok(())
}
}
}
#### `Operand` - 类型安全操作数系统
强类型操作数枚举,确保操作数类型与指令要求完全匹配:
```rust
pub enum Operand {
Reg(Register),
Imm { value: i64, size: u8 },
Mem {
base: Register, index: Register, scale: u8, displacement: i32, },
}
impl Operand {
pub fn validate_size(&self, expected_size: u8) -> Result<()> {
match self {
Operand::Reg(reg) => {
if reg.size() == expected_size {
Ok(())
} else {
Err(GaiaError::operand_size_mismatch(reg.size(), expected_size))
}
}
Operand::Imm { size, .. } => {
if *size == expected_size {
Ok(())
} else {
Err(GaiaError::immediate_size_mismatch(*size, expected_size))
}
}
Operand::Mem { base, .. } => {
self.validate_memory_operand(base, expected_size)
}
}
}
pub fn validate_push_operand(&self) -> Result<()> {
match self {
Operand::Reg(_) => Ok(()), Operand::Imm { .. } => Ok(()), Operand::Mem { .. } => Ok(()), }
}
}
```Label(String),
}
Register - 类型安全寄存器系统
强类型寄存器枚举,每个寄存器都有明确的大小和架构信息:
pub enum Register {
Eax, Ebx, Ecx, Edx,
Esp, Ebp, Esi, Edi,
Rax, Rbx, Rcx, Rdx,
Rsp, Rbp, Rsi, Rdi,
R8, R9, R10, R11, R12, R13, R14, R15,
}
impl Register {
pub fn size(&self) -> u8 {
match self {
Register::Eax | Register::Ebx | Register::Ecx | Register::Edx |
Register::Esp | Register::Ebp | Register::Esi | Register::Edi => 32,
Register::Rax | Register::Rbx | Register::Rcx | Register::Rdx |
Register::Rsp | Register::Rbp | Register::Rsi | Register::Rdi |
Register::R8 | Register::R9 | Register::R10 | Register::R11 |
Register::R12 | Register::R13 | Register::R14 | Register::R15 => 64,
}
}
pub fn validate_architecture(&self, arch: Architecture) -> Result<()> {
match (self, arch) {
(reg, Architecture::X86) if reg.size() == 32 => Ok(()),
(reg, Architecture::X86_64) if reg.size() == 64 => Ok(()),
_ => Err(GaiaError::register_architecture_mismatch(*self, arch)),
}
}
}
汇编器接口
编码接口 - 类型安全的指令编码
pub fn encode(&self, instruction: &Instruction) -> Result<Vec<u8>> {
instruction.validate()?;
match self.architecture {
Architecture::X86 => self.encode_x86(instruction),
Architecture::X86_64 => self.encode_x86_64(instruction),
_ => Err(GaiaError::unsupported_architecture(self.architecture)),
}
}
强类型优势:
- ✅ 编译时捕获操作数类型不匹配
- ✅ 架构相关的编码策略选择
- ✅ 零成本抽象,无运行时开销
X86_64Assembler 还提供以下主要方法:
new(architecture: Architecture) -> Result<Self>: 创建新的汇编器实例
decode(&self, bytes: &[u8]) -> Result<Vec<Instruction>>: 解码机器码为指令
architecture(&self) -> Architecture: 获取当前架构
set_architecture(&mut self, architecture: Architecture) -> Result<()>: 设置架构
🔧 高级用法 - 面向对象设计模式
🏭 工厂模式 - 架构特定的汇编器创建
use x86_64_assembler::X86_64Assembler;
use gaia_types::helpers::Architecture;
let mut assembler = X86_64Assembler::new(Architecture::X86_64)?;
match assembler.architecture() {
Architecture::X86 => println!("32位 x86 汇编器"),
Architecture::X86_64 => println!("64位 x86-64 汇编器"),
_ => return Err(GaiaError::unsupported_architecture(arch)),
}
🔄 状态模式 - 运行时架构切换
assembler.set_architecture(Architecture::X86)?;
let instruction = Instruction::Push { op: Operand::Reg(Register::Eax) };
let bytes = assembler.encode(&instruction)?;
assembler.set_architecture(Architecture::X86_64)?;
let instruction = Instruction::Push { op: Operand::Reg(Register::Rax) };
let bytes = assembler.encode(&instruction)?;
🧩 策略模式 - 多态的操作数处理
use x86_64_assembler::instruction::{Instruction, Operand, Register};
let operands = vec![
Operand::Reg(Register::Rax), Operand::Imm { value: 42, size: 32 }, Operand::Mem { base: Register::Rax,
index: Register::Rbx,
scale: 8,
displacement: 16,
},
];
for operand in operands {
let instruction = Instruction::Push { op: operand };
let bytes = assembler.encode(&instruction)?; }
标签和跳转
use x86_64_assembler::instruction::{Instruction, Operand};
let call_instruction = Instruction::Call {
target: Operand::Label("my_function".to_string())
};
🎯 观察者模式 - 智能错误处理
use x86_64_assembler::X86_64Assembler;
use gaia_types::{GaiaError, helpers::Architecture};
let result = X86_64Assembler::new(Architecture::ARM64);
match result {
Ok(assembler) => {
println!("✅ 强类型汇编器创建成功");
let bytes = assembler.encode(&instruction)?;
}
Err(GaiaError::UnsupportedArchitecture(arch)) => {
println!("❌ 编译时架构验证失败: {:?}", arch);
}
Err(GaiaError::InvalidOperandSize { expected, actual }) => {
println!("❌ 操作数大小不匹配: 期望 {} 位,实际 {} 位", expected, actual);
}
Err(e) => {
println!("❌ 类型安全的错误处理: {:?}", e);
}
}
🔍 编译时验证示例
let valid_instruction = Instruction::Mov {
dst: Operand::Reg(Register::Eax), src: Operand::Imm { value: 42, size: 32 }, };
let assembler = X86_64Assembler::new(Architecture::X86_64)?;
let bytes = assembler.encode(&valid_instruction)?;
📋 类型安全的错误处理系统
🛡️ 编译时错误预防
Rust 的类型系统在设计阶段就防止了大多数汇编编程错误:
let valid = Instruction::Mov {
dst: Operand::Reg(Register::Eax), src: Operand::Imm { value: 42, size: 32 }, };
🎯 强类型错误传播
使用 gaia_types::Result 和 gaia_types::GaiaError 进行类型安全的错误处理:
use gaia_types::{GaiaError, Result};
match assembler.encode(&instruction) {
Ok(bytes) => println!("✅ 编码成功: {} 字节", bytes.len()),
Err(GaiaError::InvalidInstruction { message, architecture }) => {
eprintln!("❌ 指令验证失败: {} (架构: {:?})", message, architecture);
}
Err(GaiaError::InvalidOperandSize { expected, actual }) => {
eprintln!("❌ 操作数大小错误: 期望 {} 位,实际 {} 位", expected, actual);
}
Err(GaiaError::UnsupportedArchitecture(arch)) => {
eprintln!("❌ 架构不支持: {:?}", arch);
}
Err(e) => eprintln!("❌ 类型安全错误: {:?}", e),
}