Skip to main content
The Architecture types provide access to CPU architecture information including registers, instruction sets, and disassembly.

Getting architectures

use binaryninja::architecture::Architecture;

// Get by name
let x86 = Architecture::by_name("x86_64");
let arm = Architecture::by_name("aarch64");

// List all architectures
for arch in Architecture::list() {
    println!("Architecture: {}", arch.name());
}

Architecture properties

let arch = Architecture::by_name("x86_64");

// Basic properties
println!("Name: {}", arch.name());
println!("Address size: {} bytes", arch.address_size());
println!("Default integer size: {} bytes", arch.default_integer_size());
println!("Endianness: {:?}", arch.endianness());
println!("Max instruction length: {}", arch.max_instruction_length());

Registers

// List registers
for reg in arch.registers() {
    println!("Register: {}", reg.name());
}

// Get specific register
if let Some(rax) = arch.register_by_name("rax") {
    println!("RAX index: {}", rax.id());
}

// Stack pointer
if let Some(sp) = arch.stack_pointer_register() {
    println!("Stack pointer: {}", sp.name());
}

Flags

// List flags
for flag in arch.flags() {
    println!("Flag: {}", flag.name());
}

// Get specific flag
if let Some(zf) = arch.flag_by_name("z") {
    println!("Zero flag: {}", zf.name());
}

Disassembly

use binaryninja::binary_view::BinaryViewBase;

let mut data = [0u8; 16];
bv.read(&mut data, 0x1000);

// Disassemble instruction
if let Some((tokens, length)) = arch.get_instruction_text(&data, 0x1000) {
    for token in tokens {
        print!("{}", token.text());
    }
    println!(" (length: {})", length);
}

// Get instruction info (branches, etc.)
if let Some(info) = arch.get_instruction_info(&data, 0x1000) {
    println!("Instruction length: {}", info.length);
    if !info.branch_targets.is_empty() {
        println!("Branch targets: {:?}", info.branch_targets);
    }
}

Calling conventions

// List calling conventions
for cc in arch.calling_conventions() {
    println!("Calling convention: {}", cc.name());
}

// Get default calling convention
if let Some(default_cc) = arch.default_calling_convention() {
    println!("Default: {}", default_cc.name());

    // Argument registers
    for reg in default_cc.int_arg_registers() {
        println!("  Arg register: {}", reg.name());
    }

    // Return register
    if let Some(ret_reg) = default_cc.int_return_register() {
        println!("  Return register: {}", ret_reg.name());
    }
}

Standalone platform

// Get standalone platform for architecture
let platform = arch.standalone_platform();
println!("Platform: {}", platform.name());

Complete example

use binaryninja::architecture::Architecture;

fn main() {
    // Analyze x86_64 architecture
    let arch = Architecture::by_name("x86_64");

    println!("=== {} Architecture ===", arch.name());
    println!("Address size: {} bytes", arch.address_size());
    println!("Max instruction: {} bytes", arch.max_instruction_length());

    // Registers
    println!("\nRegisters:");
    for reg in arch.registers().iter().take(8) {
        println!("  {}", reg.name());
    }

    // Calling conventions
    println!("\nCalling conventions:");
    for cc in arch.calling_conventions() {
        println!("  {}", cc.name());
    }
}

Next steps

Functions

Analyze functions

IL

Intermediate languages

Build docs developers (and LLMs) love