C++ JIT Assembler for Digamma
Schemeのアセンブラだけだとブートストラップが面倒なのでC++だけで使えるものを作っちゃいました。IA32とAMD64(Intel64)の基本的な命令だけをサポートした「おれおれ仕様」のオリジナルです:p
void test(void* vmi_thunk) { using_nanoasm; GLOBAL(VMI_THUNK); EQU(VMI_THUNK, vmi_thunk); LOCAL(TOP); LOCAL(L1); LOCAL(L2); LABEL(TOP); __ mov(rsi, qword[rbp+0x18]); __ mov(rdi, qword[rbp+0xc]); __ mov(rax, qword[rdi-0xc]); __ mov(qword[rsi], rax); __ add(rsi, 0x4); __ mov(rax, qword[rdi-0x8]); __ test(al, 0x7); __ jz(L1); __ jmp(VMI_THUNK); LABEL(L1); __ mov(rax, qword[rax+0x4]); __ mov(qword[rsi], rax); __ add(rsi, 0x4); __ mov(qword[rbp+0x18], rsi); __ lea(rax, offset(L2)); __ mov(qword[rbp+0x20], rax); __ jmp(VMI_THUNK); LABEL(L2); __ dq(TOP); }
やっぱりアセンブラは素敵です :D