以下にこのコードがあり、Delphiでも使用できるようにASMに変換したいと思います。
var
FunctionAddressList: Array of Integer;
type TFunction = function(parameter: Integer): Integer; cdecl;
function Function(parameter: Integer): Integer;
var
ExternFunction: TFunction;
begin
ExternFunction := TFunction(FunctionAddressList[5]);
Result := ExternFunction(parameter);
end;
正常に動作しますが、アセンブリバージョンを試してみると:
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では機能しません。
アセンブリバージョンでは、配列の各要素間のオフセットサイズであるため、配列を4に乗算します。したがって、両方のバージョンは同等です。
だから、なぜそれがDelphiで動作しないのか知りたいです。Delphiでは、配列内の整数値間のオフセットサイズはC ++とは異なりますか?
私はすでに1、2、4、6、8などの多くのオフセットを試しました。また、多くの種類の配列(ポインターの配列、ポインターのみ、整数の配列など)、および多くの呼び出し規約を試しました。非asmバージョンで機能したのはcdeclだけでしたが、ASMではすべてのテストが機能しませんでした。
ありがとう。