#x86-64 #assembly

nightly 汇编器

为X86-64代码设计的即时执行的高效运行时汇编器

26个版本 (9个重大更新)

使用旧的Rust 2015

0.10.1 2018年10月27日
0.9.12 2018年10月27日

#661 in 硬件支持

Download history 13/week @ 2024-03-10 7/week @ 2024-03-31

每月100次下载

AGPL-3.0

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 的作者在此工作背后的灵感表示感谢。

依赖