O ZASM fornece uma biblioteca muito flexível e leve para manipular e gerar código x86-64 usando Zydis como back-end. O Zasm armazena tudo como nós, como instruções, dados, etiquetas, seções, etc., que fornece uma maneira de manipular/transformar facilmente o código antes de serializar -o em binário. A API é inspirada no ASMJIT; portanto, se você usou asmjit antes que isso se sinta muito familiar.
Alguns dos meus projetos estavam usando Zydis e Asmjit onde as instruções onde foram decodificadas pela primeira vez com Zydis e depois colocadas no construtor da Asmjit para permitir o processamento/análise das instruções/ramificações antes de re-codificar/realocar o código modificado, há algumas downsides para essa abordagem que serão explicadas mais. A Zydis introduziu recentemente uma maneira de usar as mesmas estruturas/dados que já precisa codificar instruções que levam ao ZASM. Esta biblioteca pretende ser um montador/decodificador de nível superior, que pode ser usado para várias coisas, como o exemplo mencionado anteriormente.
Uma forte diferença entre Zasm e Asmjit é o foco em dados de instruções precisos, como acesso ao operando, uso do registro oculto, a CPU sinaliza a CPU, que pode estar ausente ou errada no ASMJit, com algumas exceções, é claro, a ASMJit visa uma maneira amigável de gerar código em tempo de mosca para que, por exemplo, scripts ou alto desempenho. O Zasm não está tentando substituir asmjit de forma alguma, tem objetivos diferentes.
A segunda razão para o Zasm é que o codificador Zydis é de nível extremamente baixo, o que significa que você não tem coisas como rótulos, o Zasm fornece uma classe de alto nível para montar instruções e fornece rótulos como um assembler comum.
O ZASM usa o Cmake em combinação com o CMKR para simplificar a manutenção dos cmakelists.txt. O edifício deve ser tão fácil quanto usar os seguintes comandos de um terminal no diretório raiz:
cmake . -B build
cmake --build build --config Release
Se você também quiser construir os testes de uso
cmake . -B build -DZASM_BUILD_TESTS=ON
O programa é o contêiner que mantém todos os dados e também serve como uma lista duplamente vinculada. As instruções, etiquetas, dados, seções etc. são armazenados como nós que permitem ao usuário remover/inserir/reordenar com bastante facilidade.
A classe Assembler fornece funções de membro gerado para gerar instruções/dados/etiquetas no programa na posição especificada do cursor. Para emitir mov rax, -1 o equivalente seria asssembler.mov(operands::rax, operands::Imm(-1));
A classe do serializador serializa os nós do programa no binário e armazena o estado resultante. Após uma serialização bem -sucedida, o usuário pode consultar o código binário resultante e dados como o endereço de etiquetas, informações de realocação, dados de seção etc.
Decodifica dados binários para o objeto de instrução que pode ser usado diretamente ou armazenado no programa.
O projeto fornece alguns exemplos básicos que podem ser encontrados aqui. Também existem vários testes para quase tudo o que o Zasm fornece, se houver algo que faltava nos testes primeiro, eles também fornecem bons exemplos. Se você ainda tiver dúvidas, pode entrar em contato conosco via Discord.