При переходе на 64-битную платформу разработчики, использующие язык программирования Pascal и среду разработки Delphi, могут столкнуться с проблемами, связанными с ассемблерным кодом. В частности, ассемблерные блоки, написанные для 32-битной платформы, не всегда корректно компилируются и работают в 64-битной среде. В данной статье мы рассмотрим, как можно исправить ассемблерный код для успешной компиляции под Win64.
Проблема
При попытке компиляции Pascal-единицы для 64-битной платформы возникают ошибки, связанные с использованием ассемблерных блоков в методах. Код, написанный для 32-битной платформы, несовместим с 64-битной архитектурой.
Примеры методов
Давайте рассмотрим два примера методов, содержащих ассемблерные блоки:
Function TSparsePointerArray.ForAll( ApplyFunction: Pointer {TSPAApply} ): Integer;
Var
itemP: PAnsiChar; { Pointer to item in section } { patched by ccy }
item: Pointer;
i, callerBP: Cardinal;
j, index: Integer;
Begin
// ... (омitted for brevity)
Asm
mov eax,[ebp] { Set up stack frame for local }
mov callerBP,eax
End;
// ... (омitted for brevity)
End;
Подтвержденный ответ
Компилятор Embarcadero для 64-битной платформы не позволяет смешивать Pascal и ассемблерный код в одном и том же функционировании. Вы можете использовать только полностью Pascal-овские или полностью ассемблерные функции. Однако вызовы между Pascal и ассемблерными функциями возможны, но они не могут сосуществовать в рамках одной функции, как это было в случае с x86.
Альтернативные подходы
Переписывание метода в 64-битном ассемблере
Вы можете переписать весь метод на 64-битном ассемблере, учитывая изменения в регистрах и призывах функций.
Переписывание метода на Pascal
Если функция TSPAApply имеет фиксированное количество параметров, вы можете переписать метод на чистый Pascal, что будет более безопасным и кросс-платформенным решением.
type
TSPAApply = function(index: Integer; item: Pointer): Integer;
Function TSparseList.ForAll(ApplyFunction: TSPAApply): Integer;
begin
Result := FList.ForAll(ApplyFunction);
end;
Function TSparsePointerArray.ForAll(ApplyFunction: TSPAApply): Integer;
var
itemP: PPointer;
i, index: Integer;
begin
// ... (переписанный код на Pascal)
end;
Использование списка методов
Для более обобщенного OOP подхода вы можете использовать список методов. Необходимо провести рефакторинг кода для более удобного использования и поддержки.
Заключение
Переход на 64-битную платформу требует тщательной переработки ассемблерного кода, написанного для 32-битных систем. Важно понимать различия в регистрах, призывах и модели памяти, чтобы успешно адаптировать код к новой архитектуре.
Исправление ассемблерного кода для корректной компиляции Pascal-единиц в среде Win64.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.