Вы можете переписать весь метод в x64 ASM.Как сказал Реми, вам нужно переписать весь метод, так как вы не можете вложить несколько asm .. end
блоков в begin .. end
.
. Реальная проблема заключается в том, что соглашения о вызовах не совпадают в Win32 иРежим Win64.Изменения регистров (т. Е. Они являются 64-битными и теперь должны включать регистры SSE2), но основная проблема заключается в том, что ваш инжектор вызовов должен знать количество параметров: в стеке должно быть определенное пространство для каждого параметра.
Если ваша функция TSPAApply
имеет несколько фиксированных параметров, вы можете преобразовать ее в простую версию на Паскале - что безопаснее всего.
type
TSPAApply = function(index: integer; item: pointer);
Function TSparseList.ForAll( ApplyFunction: Pointer {TSPAApply} ): Integer;
begin
result := FList.ForAll(ApplyFunction);
End;
Function TSparsePointerArray.ForAll( ApplyFunction: Pointer {TSPAApply} ):
Integer;
Var
itemP: PPointer;
i: Cardinal;
j, index: Integer;
Begin
Result := 0;
i := 0;
While ( i < slotsInDir ) And ( Result = 0 ) Do
Begin
itemP := secDir^[i];
If itemP <> Nil Then
Begin
j := 0;
index := i Shl SecShift;
While ( j < FSectionSize ) And ( Result = 0 ) Do
Begin
If itemP^ <> Nil Then
result := TSPAApply(ApplyFunction)(index,itemP^.Ptr);
Inc( itemP );
Inc( j );
Inc( index )
End
End;
Inc( i )
End;
End;
Но вам лучше полагаться наTMethod
список, для более общего ООП способа сделать это.Здесь неплохо было бы выполнить рефакторинг кода.