vs2008 を使用してプログラムを x64 に移植しようとしています。ただし、問題は、x64 でサポートされていないインライン asm コードがあることです。この asm コードは、未知の型または数の引数を dll から関数にプッシュするために使用されます。これは、特定の dll から使用する関数を指定できるインターピーター ベースのプログラムであり、プログラムは引数をプッシュし、コンパイル時に関数を呼び出します。
さまざまなソースを使用して、masm を使用せずにコンパイルできる asm 関数を含む個別の .asm ファイルと、vs2008 にリンクされた obj ファイルを生成すると結論付けました。x86 と x64 で異なるファイルを使用すると、両方の問題に対してプログラムがビルドされます。ただし、問題は、関数がインライン asm が行っていることを複製しないことです。
たとえば、次のインライン コードを変換しました。
double a = Evaluate(arg[i]).num;
_asm push a + 4
_asm push a
j += 8;
に:
double a = Evaluate(arg[i]).num;
EvaluateFuncArgFloat(a);
j += 8;
次の .asm ファイルを使用します。
TITLE EvaluateFuncArgFloat (evaluate_asm.asm)
.386
.model flat, C
.code
EvaluateFuncArgFloat PROC a:DWORD
push a + 4
push a
ret
EvaluateFuncArgFloat ENDP
END
これは私が期待していることをしません。double は、インライン asm を使用したときのように関数内に収まりません。
私の推測では、小さなエラーまたは省略したものがあると思われますが、何度も試行した後、動作させることができないようです。誰かがこの問題で私を助けてくれることを願っています。