ZASMは、Zydisをバックエンドとして使用してX86-64コードを操作および生成するための非常に柔軟で軽量のライブラリを提供します。 ZASMは、すべてを命令、データ、ラベル、セクションなどのノードとして保存します。これは、コードをバイナリにシリアル化する前に簡単に操作/変換する方法を提供します。 APIはASMJITに触発されているので、これが非常に馴染みがあると感じる前にASMJITを使用した場合。
私のプロジェクトのいくつかは、ZydisとAsmjitを使用していました。ここでは、Zydisで最初にデコードされ、ASMJITのビルダーに入れて、変更されたコードを再エンコード/再配置する前に指示/分岐の処理/分析を可能にしました。 Zydisは最近、ZASMにつながる指示を既にエンコードする必要があるのと同じ構造/データを使用する方法を導入しました。このライブラリは、前述の例のようなさまざまなものに使用できる高レベルのアセンブラー/デコーダーであることを目的としています。
ZASMとASMJITの強い違いは、オペランドアクセス、隠されたレジスタの使用、正しいCPUフラグなどの正確な命令データに焦点を当てていることです。もちろん、ASMJITで欠落しているか間違っている可能性があります。 ZasmはASMJITを決して置き換えようとはしていません。目標は異なります。
ZASMの2番目の理由は、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));
Serializerクラスは、プログラムノードをバイナリにシリアル化し、結果の状態を保存します。シリアル化が成功した後、ユーザーは、結果のバイナリコードと、ラベルのアドレス、再配置情報、セクションデータなどのデータを照会できます。
バイナリデータを、プログラムに直接使用または保存できる命令オブジェクトにデコードします。
このプロジェクトは、ここにあるいくつかの基本的な例を提供します。 Zasmが提供するほとんどすべてのものについてはさまざまなテストがあります。最初にテストのチェックアウトが欠けている場合、それらも良い例を提供します。まだ質問がある場合は、Discordからご連絡ください。