addressing_modes/
addressing_modes.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::Protected); 
9
10    let instructions = &[
11        Instruction::new2(Mnemonic::MOV, Operand::Direct(Reg::EBX), Operand::Indirect(Reg::EAX, Some(OperandSize::Dword), None)), // mov ebx, dword ptr [eax]
12        Instruction::new2(Mnemonic::MOV, Operand::Direct(Reg::EBX), Operand::IndirectDisplaced(Reg::EAX, 5, Some(OperandSize::Dword), None)), // mov ebx, dword ptr [eax+5]
13        Instruction::new2(Mnemonic::MOV, Operand::Direct(Reg::EBX), Operand::IndirectScaledIndexed(Reg::EAX, Reg::ECX, RegScale::Two, Some(OperandSize::Dword), None)), // mov ebx, dword ptr [eax+ecx*2]
14        Instruction::new2(Mnemonic::MOV, Operand::Direct(Reg::EBX), Operand::IndirectScaledIndexedDisplaced(Reg::EAX, Reg::ECX, RegScale::Two, 5, Some(OperandSize::Dword), None)), // mov ebx, dword ptr [eax+ecx*2+5]
15        Instruction::new2(Mnemonic::MOV, Operand::Direct(Reg::EBX), Operand::Memory(5, Some(OperandSize::Dword), None)), // mov ebx, dword ptr ds:5
16    ];
17
18    let mut bytes_written = 0;
19
20    for instr in instructions {
21        bytes_written += writer.write(instr).unwrap();
22    }
23    
24    print!("Output ({} bytes): ", bytes_written);
25    for byte in writer.get_inner_writer_ref().get_ref().iter() {
26        print!("{:02X} ", byte);
27    }
28    println!("");
29}