このテクニックは、バイト列の操作などの速度を要する低レベルな処理を自前で実装したい時に役立ちます。
埋め込むネイティブコード関数を脳内アセンブルで作るのは大変なので、C言語などのコンパイラが生成する中間ファイルを使用するといいでしょう。
VisualStudioでは、「.cod」という拡張子の中間ファイルとして、アセンブラや16進数列の機械語コードが出力されます。
下記は、Base.ng中で定義されているネイティブコード関数埋め込みの例です。
memIndexOf=(new CFunction( Hex.decode('55 8B EC (中略) E5 5D C3') )).toFunction([Pointer,Int,Pointer,Int],Int)ライブラリオブジェクトの「proc()」の代わりに、「(new CFunction(Hex.decode("機械語の16進数文字列"))).toFunction([引数の型],返り値の型)」のようにして、16進数文字列をバイト配列→関数ポインタオブジェクト→ラッパー関数と変換しています。
0 件のコメント:
コメントを投稿