1

我正在尝试使用 vs2008 将程序移植到 x64。然而,问题在于,这是一些 x64 不支持的内联 asm 代码。此 asm 代码用于将具有未知类型或编号的参数从 dll 推送到函数。它是一个基于解释器的程序,您可以在其中指定要从某个 dll 使用的函数,并且程序会推送参数并在编译时调用该函数。

使用各种来源,我得出的结论是生成单独的 .asm 文件,其中包含 asm 函数,这些函数可以编译为 unsing masm 及其链接到 vs2008 的 obj 文件。为 x86 和 x64 使用不同的文件,程序为这两个问题构建。然而问题是,这些函数不能复制内联汇编正在做的事情。

我转换了以下内联代码,例如:

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 个数字压入堆栈并且没有将它们删除 a+4 和 a

大概您的原始代码的另一部分在原始程序中处理此问题

于 2013-06-15T10:13:54.920 回答