AsmJit испускает байты или x64 абсолютный дальний прыжок

Я хочу создать абсолютный дальний прыжок с помощью asmjit. Байты этого скачка:

FF 25 00 00 00 00 // jmp qword ptr [null offset]
00 00 00 00 00 00 00 00 // 8-byte jump target address

Но я не знаю, как испустить jmp qword ptr [*]со смещением 0 и байтами необработанного адреса после него.
Кто-нибудь может мне помочь?
Заранее спасибо!

UPD: я умею выдавать jmp qword ptr [*].

a.jmp(asmjit::x86::ptr(asmjit::x86::rip));

Но как я могу выдать необработанные байты адреса?

1 ответ

Решение

Есть несколько вариантов:

а) Вставьте адрес после перехода, это отвечает на вопрос:

a.jmp(asmjit::x86::ptr(asmjit::x86::rip));
a.embedUInt64(addressToEmbed);

б) Сделайте то же самое с меткой:

Label constPool = a.newLabel();
a.jmp(x86::ptr(constPool));

// later in the code.
a.bind(constPool);
a.embedUInt64(addressToEmbed);
// possibly more addresses in the pool.
embedUInt64(anotherAddress);

c) Используйте абсолютный адрес в самом jmp, поскольку AsmJit добавит этот адрес в AddressTable, который будет выдан в конце потока инструкций (в основном он будет выполнять (b) сам по себе или использовать 32-битное относительное смещение, если это возможно).

a.jmp(absoluteAddress);

d) Если вам нужен подход постоянного пула (b), но вы хотите немедленно передать адрес, также можно использовать несколько разделов - несколько разделов похожи на наличие нескольких буферов, которые будут сглажены в конце сборки. Я бы указал вам на тест AsmJit под названиемasmjit_test_x86_sections.cpp в тестовом каталоге AsmJit.

Кроме того, у Asmjit есть документация, доступная здесь: https://asmjit.com/doc/index.html - она ​​регулярно обновляется и отражает основную ветку.

Другие вопросы по тегам