スタックを操作するのは大変なことだと思いますが、私にとっては素晴らしい教訓になると思います。インターネットを検索したところ、呼び出し規約が見つかりました。私はその仕組みとその理由を知っています。「Callee clean-up stack」のいくつかをシミュレートしたいのかもしれませんが、おそらくstdcall、fastcallは問題ではありません。重要なのは、誰がスタックをクリーンアップするかということです。そうすれば、私が行う作業が少なくなります:)
例えば。私はCで関数を持っています
double __fastcall Add(int a, int b) {
return a + b;
}
カレーだろう
そして、タイプ void* のこの関数へのポインタを持っています。
void* p = reinterpreted_cast<void*>(Add);
そして、私は関数 Caller を持っています
void Call(void* p, int a, int b) {
//some code about push and pop arg
//some code about save p into register
//some code about move 'p' into CPU to call this function manually
//some code about take of from stack/maybe register the output from function
}
以上で、呼び出し規約「Calle clean-up」を使用するときに役立ちます。
//some code about cleans-up this mess
私はそれを行う方法がわかりません。アセンブラで実行できることは知っています。しかし、私はそれを恐れており、この言語に「触れる」ことはありません。私はCでその呼び出しをシミュレートするのは素晴らしいことですが、誰かがASMでそれを行うことができれば、私はうんざりします:)
また、関数を手動で呼び出す方法がわかると、いくつかのパラメーター(その数とサイズがわかっている場合)と任意のタイプの関数を使用して関数を呼び出すことができます。したがって、その関数が正しい呼び出し規則にある場合、任意の言語で任意の関数を呼び出すことができます。
Windows OS x64 と MinGw を使用しています