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 分支。
我想使用 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 分支。