ASM将函数参数推送到堆栈

时间:2013-06-14 16:25:30

标签: visual-c++ assembly 64-bit push inline-assembly

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

使用各种来源我得出结论,生成包含asm函数的单独的.asm文件,这些函数可以编译为unsing masm,并且它们的obj文件链接到vs2008。对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

这不符合我的期望。双重函数不会像使用内联asm时那样在函数中结束。

我的猜测是有一个小错误或我遗漏的东西,但经过多次尝试我似乎无法让它工作。希望有人可以帮助我解决这个问题,它非常受欢迎。

1 个答案:

答案 0 :(得分: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个数字推入堆栈而没有删除它们+ 4和

据推测,原始代码的另一部分在原始程序中处理此问题