26个版本 (9个重大更新)
使用旧的Rust 2015
0.10.1 | 2018年10月27日 |
---|---|
0.9.12 | 2018年10月27日 |
#661 in 硬件支持
每月100次下载
2.5MB
41K SLoC
汇编器
汇编器提供了一种快速的运行时汇编器,用于x86-64长模式指令,使用Rust的函数调用来实现。通过使用一种设计,Rust的发布构建优化可以有效地工作,它能够将汇编的机器代码指令作为模板嵌入Rust代码中,从而使得专门的代码生成尽可能快。它特别适合作为JIT的后端。
这种技术与dynasm中使用的不同,但它是由在运行时优化消息过滤器函数的需要驱动的。指令生成的代码受到了斯坦福的x64asm的启发。
因此,不会进行跳跃(和相关)指令的松弛,即所有跳跃都使用32位位移,而不是优化为8位位移。还包括额外的专用支持(例如 BitMemory
),以便处理可能放置在第一个2Gb之外(例如在Mac OS X上)的代码。
入门指南
按照常规将crate assembler
添加到您的Cargo.toml文件中,并添加一个extern crate assembler
。创建一个新的ExecutableAnonymousMemoryMap
实例,并使用它来获取InstructionStream
实例。这几乎包含了您可能想要的一切,从输出指令排列到输出原始字节,获取函数指针,使用标签,以及支持索引计算跳跃。
功能
- 所有有效的x64指令
- 多字节的NOPs
- 除了AVX512、3D Now!、XOP和AMD已弃用的位操作之外的所有指令集扩展
- 所有8位(包括高8位)、16位、32位和64位通用寄存器
- 所有浮点数、SSE (MM)、XMM和YMM寄存器
- 所有段寄存器
- 标签
- 计算跳跃
- C _bool返回的快捷方式
- 函数前缀和后缀的快捷方式
缺少的功能
期望的
实现这些功能的拉取请求将非常受欢迎*。
- 支持AVX512指令及其相关内存操作数。
- 3D Now!'s
PREFETCH
。 - 支持使用调试、控制和边界寄存器。
- 在指令生成序列中的
if
子句,以输出更高效的已知寄存器形式,例如默认为RAX
的形式。
当然,包括版权归属项目!
可能
- 指令指针应是一个
u64
而不是usize
,以便在32位平台上汇编64位代码。但是,本项目的主要用途是生成在运行时使用的汇编器。
不太可能添加
- Intel Xeon Phi特定的指令。
- 包括
PREFETCH
在内的AMD 3D Now!指令。 - AMD已废弃的位操作指令和
XOP
编码前缀。 - 指令放松;需要使用链表来管理指令“包”
- 动态重定位
- 32位兼容模式
- 32位遗产模式、16位模式、实模式等
许可
本项目的许可为 Affero GNU公共许可证3.0 (AGPL-3.0)。注意,早期、未发布版本使用了从 dynasm 项目分叉的源代码;此代码已不再在代码库中使用。然而,assembler 的作者对 dynasm 的作者在此工作背后的灵感表示感谢。