私は16ビットのレジスタベースの仮想マシンを持っています。実際のx86マシンコードをコンパイルする手順は何ですか?コンパイルされたコードを別の実行可能ファイル/ DLLとリンクできる必要がある場合を除き、私はJITコンパイラを作成することを検討していません。VM固有のコードをx86マシンコードにコンパイルするにはどうすればよいですか?
VMは、VMがプロジェクトに追加された場合、特別な言語構成を追加できるようになっています。 (例えば、それがゲームエンジンに埋め込まれている場合、「エンティティ」オブジェクトタイプが追加され、エンジンのいくつかのC関数が公開される可能性があります)。これにより、公開された特定のC関数にコードが完全に依存する公開されているC++クラスを、埋め込まれているアプリケーションに追加します。
スクリプトコードをVMバイトコードからネイティブEXEにコンパイルすると、このような「リンク」が可能ですか?
これはLuaのVMのようにレジスタベースです。すべての基本変数は巨大なC配列である「レジスタ」に格納されています。スコープが変更されると、レジスタポインタはインクリメントまたはデクリメントされるため、レジスタ番号は相対的であり、スタックポインタと同様です。例えば:
int a = 5;
{
int a = 1;
}
仮想マシンの擬似アセンブリでは、次のようになります。
mov_int (%r0, $5)
; new scope, the "register pointer" is then incremented by the number
; of bytes that are used to store local variables in this new scope. E.g. int = 4 bytes
; say $rp is the "register pointer"
add (%rp, $4) ; since size of int is usually 4 bytes
; this is if registers are 1 bytes in size, if they were
; 4 bytes in size it would just be adding $1
mov_int (%r0, $1) ; now each register "index" is offset by 4,
; this is now technically setting %r4
; different instructions are used to get values above current scope
sub (%rp, $4) ; end of scope so reset %rp
この部分についての私の質問は、私はこの種のもののためにスタック・ポインタを使用する必要があります、ありますか?ベースポインタ?このコンセプトを置き換えるのに私は何が使えますか?
あなたの質問はQ&Aサイトでは広すぎます。あなたは本や大学のコースが必要です。 – EJP
私はそれをはるかに広範ではなく、より明確にしたので、2つの簡単な質問に沸きます。 – Accumulator
私はあなたがここで実際に答えることができる質問を持っていると思いますが、あなたが求めていることを正確に理解するのは少し難しいと思っています。私はあなたを助けたいと思っていますが、質問をもう一度試して言い換えることができれば、本当に助けてくれるでしょう。) – Cauterite