參考資訊:
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