** "Looks like JavaScript, brain (contents) is Ruby, (stability is AC / DC)" ** Scripting language Kinx ). This time is the JIT library extra edition.
This is a newly added function to the JIT library introduced in here.
I added a function to execute arbitrary binary code to JIT library. For those who really want fine control. This is heavily architecture dependent. And it's easy to crash.
First is a sample.
okay.kx
using Jit;
var code
    = System.PLATFORM == "X86_64-WIN" ? <0x48, 0x89, 0xc8, 0xc3>    // mov rax, rcx | ret
    : System.PLATFORM == "X86_64"     ? <0x48, 0x89, 0xf8, 0xc3>    // mov rax, rdi | ret
    : null;
if (code.isBinary) {
    Jit.dump(code);
    var runner = new Jit.Runner(code);
    System.println(runner.run(100));
}
$ ./kinx okay.kx
       0:   48 89 f8                                    mov rax, rdi
       3:   c3                                          ret
100
By the way, it is a function that simply returns the numerical value given as an argument, and since there is no register to destroy, there is no prologue or epilogue, and the value that comes to the first argument is set to the return value (rax) and ret is performed. It's just for you.
System.PLATFORM
System.PLATFORM is used to isolate x64 and Windows or non-Windows. With a raw assembler, it is troublesome to have to separate it in this way. However, you can fully enjoy the dangerous and sweet scent of ** you can do anything **.
On Windows, the first argument comes in the rcx register because it is based on the Microsoft calling convention. In contrast, the System V calling convention, which is mostly adopted by non-Microsoft, puts the first argument in the rdi register.
What is specifically returned by System.PLATFORM is ...
| Value | Window? | 
|---|---|
| "X86_32-WIN" | O | 
| "X86_64-WIN" | O | 
| "ARM_THUMB2-WIN" | O | 
| "ARM_V7-WIN" | O | 
| "ARM_V5-WIN" | O | 
| "ARM_64-WIN" | O | 
| "X86_32" | |
| "X86_64" | |
| "ARM_THUMB2" | |
| "ARM_V7" | |
| "ARM_V5" | |
| "ARM_64" | |
| "PPC_64" | |
| "PPC_32" | |
| "MIPS_32" | |
| "MIPS_64" | |
| "SPARC_32" | |
| "TILEGX" | |
| "UNSUPPORTED" | 
is.
crash.kx
using Jit;
var code = <0x48, 0x31, 0xc0,   // xor rax, rax
            0x48, 0x8b, 0x00>   // mov rax, [rax]
            ;
Jit.dump(code);
var runner = new Jit.Runner(code);
System.println(runner.run());
$ ./kinx crash.kx
       0:   48 31 c0                                    xor rax, rax
       3:   48 8b 00                                    mov rax, [rax]
Segmentation fault (core dumped)
Fufufu ... It's dangerous.
In a nutshell, it's like ** "Take your own risk." **. However, I don't think there are many scripting languages that go into this kind of place, so it may be worth it. For example, if you have this library, Xbyak seems to be portable! Kinx also has operator overrides (not called overloads).
JIT is becoming more and more familiar.
see you.