encode_long/
encode_long.rs

1extern crate x86asm;
2
3use std::io::Cursor;
4use x86asm::{Instruction, InstructionWriter, Mnemonic, Mode, Operand, OperandSize, Reg, RegScale};
5
6fn main() {
7    let buffer = Cursor::new(Vec::new());
8    let mut writer = InstructionWriter::new(buffer, Mode::Long); 
9
10    // mov rax, qword ptr [rip+100]
11    // mov rbx, 500
12    // sub rax, rbx
13    // mov [rcx+rdx*4], rax
14    
15    let instructions = &[
16        Instruction::new2(Mnemonic::MOV, Operand::Direct(Reg::RAX), Operand::IndirectDisplaced(Reg::RIP, 100, Some(OperandSize::Qword), None)),
17        Instruction::new2(Mnemonic::MOV, Operand::Direct(Reg::RBX), Operand::Literal32(500)),
18        Instruction::new2(Mnemonic::SUB, Operand::Direct(Reg::RAX), Operand::Direct(Reg::RBX)),
19        Instruction::new2(Mnemonic::MOV, Operand::IndirectScaledIndexed(Reg::RCX, Reg::RDX, RegScale::Four, Some(OperandSize::Qword), None), Operand::Direct(Reg::RAX)),
20    ];
21
22    let mut bytes_written = 0;
23
24    for instr in instructions {
25        bytes_written += writer.write(instr).unwrap();
26    }
27    
28    print!("Output ({} bytes): ", bytes_written);
29    for byte in writer.get_inner_writer_ref().get_ref().iter() {
30        print!("{:02X} ", byte);
31    }
32    println!("");
33}