** "Ressemble à JavaScript, le cerveau (contenu) est Ruby, (la stabilité est AC / DC)" ** Langage de script Kinx ). Cette fois, c'est l'édition supplémentaire de la bibliothèque JIT.
Il s'agit d'une fonction nouvellement ajoutée à la bibliothèque JIT introduite dans Ici.
J'ai ajouté une fonction pour exécuter du code binaire arbitraire dans JIT Library. Pour ceux qui veulent vraiment un contrôle précis. Cela dépend fortement de l'architecture. Et il est facile de planter.
Le premier est un échantillon.
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
À propos, c'est une fonction qui renvoie simplement la valeur numérique donnée par l'argument, et comme il n'y a pas de registre à détruire, il n'y a pas de prologue ou d'épilogue, et la valeur qui est arrivée au premier argument est définie sur la valeur de retour (rax
) et ret
est exécuté. C'est juste pour toi.
System.PLATFORM
Le System.PLATFORM
est utilisé pour isoler x64 et Windows ou non Windows. Il est gênant de devoir séparer cela avec un assembleur brut. Cependant, vous pouvez pleinement profiter du parfum dangereux et sucré de ** vous pouvez tout faire **.
Sous Windows, le premier argument vient dans le registre rcx
car il est basé sur la convention d'appel de Microsoft. En revanche, la convention d'appel System V, qui est principalement adoptée par des non-Microsoft, place le premier argument dans le registre rdi
.
Ce qui est spécifiquement renvoyé par System.PLATFORM
est ...
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" |
est.
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 ... C'est dangereux.
En un mot, c'est comme ** «Prenez vos risques». **. Cependant, je ne pense pas qu'il y ait beaucoup de langages de script qui entrent dans ce genre d'endroit, donc cela peut en valoir la peine. Par exemple, si vous avez cette bibliothèque, Xbyak semble être portable! Kinx a également des remplacements d'opérateurs (non appelés surcharges).
JIT devient de plus en plus familier.
à plus.
Recommended Posts