我有下面的代码,我想将它翻译成ASM,也可以在Delphi中使用。使用指针转换代码,以汇编在Pascal中 - Delphi
它的工作原理normaly,但是当我尝试了大会版本:
function Function(parameter: Integer): Integer; cdecl;
asm
mov eax, FunctionAddressList
jmp dword ptr [eax + 5 * 4]
end;
它应该工作,因为在C++中,它工作在两个方面:
void *FunctionAddressList;
_declspec(naked) int Function(int parameter)
{
_asm mov eax, FunctionAddressList;
_asm jmp dword ptr [eax + 5 * 4];
}
typedef int (*TFunction)(int parameter);
int Function(int parameter)
{
TFunction ExternFunction = ((TFunction *)FunctionAddressList)[5];
return ExternFunction(parameter);
}
但它在Delphi中不起作用。
在Assembly版本中,它将数组乘以4,因为它是数组每个元素之间的偏移量,所以两个版本都是等价的。
所以,我想知道为什么它不适用于Delphi。在Delphi中,数组中Integer值之间的偏移量大小与C++不同?
我已经尝试了许多偏移量,例如1,2,4,6,8等。还有很多类型的Array(指针数组;仅指针;整数数组等等),并且我试过了许多调用约定,并且cdecl是唯一与非asm版本一起工作的,但对于ASM,所有测试都不起作用。
谢谢。
我现在没有使用C++,但我认为你的C++(我认为你使用Visual C++)裸函数的代码也假设栈上的参数。您必须自己编写序言和epilog(以asm的形式)以使用cdecl调用约定的裸函数中的参数。你不这样做,因为你不需要这里的参数,并把它传递给地址列表中的函数。 – kludg 2010-02-01 01:11:22