7个版本 (4个破坏性)

0.5.1 2024年7月7日
0.5.0 2024年6月19日
0.4.0 2024年6月15日
0.3.0 2024年6月15日
0.1.2 2024年6月11日

#381 in 编码

每月 23 次下载

AGPL-3.0-or-later

95KB
2K SLoC

Pollex

Pollex 是一个用于操作 Arm ISAs 指令的 Rust 编写的库。

请参阅 Docs.rs 了解文档。

支持

Pollex 支持在 Arm32 目标上对 Arm 和 Thumb 指令进行编码。计划支持 Arm64。

使用

可以直接使用 Instruction 类型直接创建指令

use pollex::arm32::{
    Instruction,
    Predicate,
    Register,
    Sflag,
    Shifter,
};

// MOVS r0, r1
let instr = Instruction::Move {
    predicate:   Predicate::Always,
    destination: Register::R0,
    source:      Shifter::from_register(Register::R1),
    s:           Sflag::On,
};

指令也可以从字符串中解析

use pollex::arm32::{
    Instruction,
    Predicate,
    Register,
    Sflag,
    Shifter,
};

let instr: Instruction = "CPY r0, r1".parse()?;

// Is equivalent to:

let instr = Instruction::Move {
    predicate:   Predicate::Always,
    destination: Register::R0,
    source:      Shifter::from_register(Register::R1),
    s:           Sflag::Off,
};

# Ok::<(), Box<dyn std::error::Error>>(())

但请注意,后者目前尚未实现。

可以使用 InstructionCodec 类型将指令编码为 Arm 和 Thumb

use pollex::arm32::{Instruction, InstructionCodec};

let instr: Instruction = "BX lr".parse()?;

let mut codec = InstructionCodec::new();

let arm_opcode   = codec.encode_arm(instr)?;
let thumb_opcode = codec.encode_thumb(instr)?;

assert_eq!(arm_opcode, 0b11100001_00101111_11111111_00011110);
assert_eq!(thumb_opcode.0, 0b01000111_01110000);
assert_eq!(thumb_opcode.1, None);

# Ok::<(), Box<dyn std::error::Error>>(())

版权所有 2024 Gabriel Bjørnager Jensen。

本程序是自由软件:您可以按照自由软件基金会发布的 GNU Affero 通用公共许可证的条款重新分配和/或修改它,许可证版本为3,或者(根据您的选择)任何更高版本。

本程序以希望它将是有用的,但没有任何保证;甚至没有对适销性或特定用途适用性的暗示保证。有关详细信息,请参阅 GNU Affero 通用公共许可证。

您应该已随此程序收到一份 GNU Affero 通用公共许可证的副本。如果没有,请参阅 https://www.gnu.org/licenses/

商标

Arm 和 Thumb 是 Arm Limited(或其子公司或关联公司)的注册商标或商标。

无运行时依赖