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 - она регулярно обновляется и отражает основную ветку.