程式語言 - GNU - AsmJIT - Hello, world!



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