ZASM提供了一个非常灵活且轻巧的库,可以使用Zydis作为后端来操纵和生成X86-64代码。 ZASM将所有内容存储为节点,例如指令,数据,标签,部分等,它提供了一种在将代码序列化为二进制之前轻松操纵/转换代码的方法。 API的灵感来自ASMJIT,因此,如果您在此之前使用过ASMJIT,则会感到非常熟悉。
我的一些项目正在使用Zydis和Asmjit,其中首次使用Zydis解码的指令,然后放入Asmjit的构建器中,允许对指令/分支进行处理/分析,然后再重新编码/重新编码/重新安装修改后的代码,有几个偏低的方法可以进一步解释。 Zydis最近引入了一种使用已经必须编码导致ZASM的指令的相同结构/数据的方法。该库的目标是成为更高级别的汇编器/解码器,可用于以前提到的示例等各种内容。
ZASM和ASMJIT之间的强烈差异是关注准确的指令数据,例如操作数访问,隐藏的寄存器使用,正确的CPU标志,所有这些标志在ASMJIT中可能缺少或错误,但某些例外,ASMJIT的目标是一种友好的方式,可以在Flys上生成代码,以便让我们说脚本计算或高性能计算。 ZASM并不试图以任何方式替换ASMJIT,它具有不同的目标。
ZASM的第二个原因是Zydis编码器的水平极低,这意味着您没有标签之类的东西,ZASM为组装说明提供了高级类,并提供像普通汇编器一样的标签。
Zasm与CMKR结合使用CMAKE来简化cmakelists.txt的维护。建筑物应该与使用根目录中终端的以下命令一样容易:
cmake . -B build
cmake --build build --config Release
如果您还想构建测试
cmake . -B build -DZASM_BUILD_TESTS=ON
程序是包含所有数据并用作双重链接列表的容器。说明,标签,数据,部分等被存储为节点,该节点允许用户轻松删除/插入/重新订购。
汇编程序类提供生成的成员功能,以在指定的光标位置将指令/数据/标签生成程序。为了发出mov rax, -1等效的是asssembler.mov(operands::rax, operands::Imm(-1));
序列化器类将程序节点序列化为二进制,并存储所得状态。成功序列化后,用户可以查询所得的二进制代码和数据,例如标签,搬迁信息,部分数据等。
将二进制数据解码到可以直接使用或存储在程序中的指令对象中。
该项目提供了一些基本示例,可以在此处找到。 ZASM提供的几乎所有内容也都有各种测试,如果首先缺少一些检查,它们也提供了很好的例子。如果您仍然有疑问,可以通过Discord与我们联系。