1

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 を使用したときのように関数内に収まりません。

私の推測では、小さなエラーまたは省略したものがあると思われますが、何度も試行した後、動作させることができないようです。誰かがこの問題で私を助けてくれることを願っています。

4

1 に答える 1

0

これを行う卑劣な方法は

 EvaluateFuncArgFloat PROC a:DWORD

    pop eax            ;ret address popped to a safe register (if not ax/eax)
    push    a + 4
    push    a
    push eax           ;ret address back at top of stack
    ret

 EvaluateFuncArgFloat ENDP

問題は、スタックに 2 つの数値をプッシュし、それらを削除していないことです。

おそらく、元のコードの別の部分が元のプログラムでこれを処理しています

于 2013-06-15T10:13:54.920 に答える