У меня есть этот код ниже, и я хочу перевести его на ASM, чтобы использовать и в Delphi.
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 размер смещения между значениями Integer в массиве отличается от C ++?
Я уже пробовал много смещений, как 1, 2, 4, 6, 8 и т. Д. И много типов Array (Array of Pointer; только Pointer; Array of Integer и т. Д.), И я пробовал много соглашения о вызовах, и cdecl был единственным, кто работал с версией без asm, но с ASM все тесты не работали.
Спасибо.