我正在尝试使用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时那样在函数中结束。
我的猜测是有一个小错误或我遗漏的东西,但经过多次尝试我似乎无法让它工作。希望有人可以帮助我解决这个问题,它非常受欢迎。
答案 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和
据推测,原始代码的另一部分在原始程序中处理此问题