AsmJit 发出字节或 x64 绝对远跳转

AsmJit emit bytes or x64 absolute far jump

我想使用 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));

但是我怎样才能发出原始地址字节呢?

有多个选项:

a) 嵌入跳转后的地址,回答问题:

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

b) 对标签做同样的事情:

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 - 它会定期更新并反映 master 分支。