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 次下载
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(或其子公司或关联公司)的注册商标或商标。