Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Исправление ассемблерного кода для компиляции Pascal-единицы под Win64

Delphi , ОС и Железо , Windows

При переходе на 64-битную платформу разработчики, использующие язык программирования Pascal и среду разработки Delphi, могут столкнуться с проблемами, связанными с ассемблерным кодом. В частности, ассемблерные блоки, написанные для 32-битной платформы, не всегда корректно компилируются и работают в 64-битной среде. В данной статье мы рассмотрим, как можно исправить ассемблерный код для успешной компиляции под Win64.

Проблема

При попытке компиляции Pascal-единицы для 64-битной платформы возникают ошибки, связанные с использованием ассемблерных блоков в методах. Код, написанный для 32-битной платформы, несовместим с 64-битной архитектурой.

Примеры методов

Давайте рассмотрим два примера методов, содержащих ассемблерные блоки:

Пример 1: Метод TSparseList.ForAll

Function TSparseList.ForAll( ApplyFunction: Pointer {TSPAApply} ): Integer; Assembler;
Asm
    MOV     EAX,[EAX].TSparseList.FList
    JMP     TSparsePointerArray.ForAll
End;

Пример 2: Метод TSparsePointerArray.ForAll

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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 17:05:39/0.0032680034637451/0