參考資訊:
https://asmjit.com/
main.cpp
#include <asmjit/asmjit.h>
#include <iostream>
#include <cstdio>
using namespace asmjit;
int main(int argc, char *argv[])
{
JitRuntime rt;
CodeHolder code;
void (*pfn)(void);
const char msg[] = "Hello, world!\n";
code.init(rt.environment());
x86::Assembler a(&code);
Label fmtStr = a.newLabel();
a.sub(x86::rsp, 8);
a.lea(x86::rdi, x86::ptr(fmtStr));
a.xor_(x86::eax, x86::eax);
a.mov(x86::rax, (uint64_t)printf);
a.call(x86::rax);
a.add(x86::rsp, 8);
a.ret();
a.bind(fmtStr);
a.embed(msg, sizeof(msg));
rt.add(&pfn, &code);
pfn();
rt.release(pfn);
return 0;
}
編譯、執行
$ g++ main.cpp -o test -lasmjit -ggdb
$ ./test
Hello, world!
(gdb) b main.cpp:30
(gdb) r
(gdb) x/10i pfn
0x7ffff7be0000: sub $0x8,%rsp
0x7ffff7be0004: lea 0x13(%rip),%rdi # 0x7ffff7be001e
0x7ffff7be000b: xor %eax,%eax
0x7ffff7be000d: movabs $0x7ffff78606f0,%rax
0x7ffff7be0017: call *%rax
0x7ffff7be0019: add $0x8,%rsp
0x7ffff7be001d: ret