Хорошие ресурсы для использования ассемблера в Delphi? - PullRequest
7 голосов
/ 17 августа 2011

Вопрос

Есть ли какие-нибудь ресурсы для изучения того, как использовать ассемблер в Delphi?

Справочная информация

Я нашел и прочитал некоторые общие ссылки на сборку и набор команд (x86, MMX, SSE и т. Д.). Но мне трудно применить эту информацию в Delphi. Общие вещи, например, как получить значение свойства класса и т. Д.

Я хотел бы иметь опцию , чтобы использовать сборку при оптимизации кода.

Я понимаю:

  • Будет трудно победить компилятор.
  • Методы оптимизации высокого уровня с гораздо большей вероятностью повысят производительность на несколько порядков по сравнению с оптимизацией низкого уровня сборки. (Например, выбор разных алгоритмов, кэширование и т. Д.)
  • Профилирование жизненно важно. Я использую Sampling Profiler для реального анализа производительности и подсчета тактов процессора для низкоуровневых деталей.

Мне интересно узнать, как использовать ассемблер в Delphi, потому что:

  • Это не помешает иметь другой инструмент в наборе инструментов.
  • Это поможет понять, какой вывод генерируется компилятором.
  • Понимание того, что делает компилятор, может помочь в написании более эффективного кода на паскале.
  • Мне любопытно.

Ответы [ 5 ]

12 голосов
/ 17 августа 2011

Вот ресурс, который может быть полезен ...

www.guidogybels.eu / docs / Использование% 20Assembler% 20in% 20Delphi.pdf

(Я хотел добавить комментарий к @Glenn с этой информацией, но вынужден использовать механизм ответа, так как я новичок в этом форуме и недостаточно репсов ...)

6 голосов
/ 17 августа 2011

Большая часть оптимизации связана с созданием более совершенных алгоритмов: как правило, именно здесь вы можете добиться улучшения скорости на «порядок».

Мир сборки x64 - это большое изменение в мире сборки x86. Это означает, что с введением x64 в Delphi в XE2 (очень скоро сейчас) вам придется написать весь свой ассемблерный код дважды .

Получение лучшего алгоритма в Delphi избавит вас от необходимости писать этот ассемблерный код.

Основной областью, в которой может помочь сборка (но часто очень умно созданный код Delphi также помогает), является низкоуровневое переключение бит / байт, например, при выполнении шифрования. С другой стороны, FastMM (менеджер быстрой памяти для Delphi) содержит почти весь код, написанный на Delphi.

Как уже писал Макрос: начинать с разобранного кода часто - хорошее начало. Но оптимизация сборки может пойти очень далеко.
Примером, который вы можете использовать в качестве отправной точки, является, например, SynCrypto unit , который имеет опцию для использования либо Delphi, либо кода сборки.

5 голосов
/ 17 августа 2011

Как я читаю ваш пост, вы ищете не столько ресурсы ассемблера, сколько ресурсы, чтобы объяснить, как объявления Delphi структурированы в памяти, чтобы вы могли получить к ним доступ через ассемблер.Это действительно трудно найти, но не невозможно.

Здесь - хороший ресурс, который я нашел, чтобы начать понимать, как Delphi структурирует свои объявления.Поскольку ассемблер работает только с дискретными адресами данных для типов данных, определенных ЦП, вам будет хорошо с любой структурой Delphi, если вы понимаете ее и правильно обращаетесь к ней.

Единственная другая проблема - как взаимодействовать сDelphi-процедуры и заголовки функций для получения нужных данных (при условии, что вы хотите, чтобы ваш ассемблер использовал встроенное средство Delphi), но это просто подразумевает понимание стандартных соглашений о вызовах функций. Это и , это будет полезно с этой целью для понимания этих понятий.

Теперь использование фактического ассемблера (связанных файлов OBJ) в отличие от встроенного ассемблера - еще одна тема,который будет варьироваться в зависимости от выбранного ассемблера.Вы также можете найти информацию об этом, но если у вас есть интерес, вы всегда можете задать этот вопрос тоже.

HTH.

4 голосов
/ 17 августа 2011

Чтобы эффективно использовать BASM, вам необходимо знать как (1), как Delphi работает на низком уровне, так и (2) сборки. В большинстве случаев вы не найдете обе эти вещи описанными в одном месте.

Тем не менее, BASM Денниса Кристенсена для начинающих и эта статья Delphi3000 идут в этом направлении. Для более конкретных вопросов, помимо Stackoverflow, весьма полезен и форум Embarcadero BASM .

2 голосов
/ 17 августа 2011

Самое простое решение - это всегда кодировать его на паскале и смотреть на сгенерированный ассемблер.

По быстродействию ассемблер обычно имеет только плюс в тесных циклах, и в общем коде вряд ли есть улучшение, если оно вообще есть,В моем коде только один фрагмент ассемблера, и преимущество заключается в перекодировании векторной операции с плавающей запятой в SSE с фиксированной запятой.Насыщенность, обеспечиваемая наборами команд SIMD, является дополнительным бонусом.

Хуже того, очень плохо советуемый ассемблерный код, плавающий по сети, на самом деле медленнее, чем паскаль-эквиваленты на современных процессорах, потому что компромиссы процессоров со временем менялись.


Обновление:

Затем просто загрузите свойство класса в локальную переменную в прологе вашей процедуры перед входом в цикл ассемблера или переместите ассемблер на другую процедуру.Выберите ваши битвы.

Изучение источника RTL / VCL может также дать идеи, как получить доступ к определенным конструкциям.

Кстати, не вся низкоуровневая оптимизация выполняется с использованием ассемблера.На уровне Pascal с некоторым знанием указателя тоже можно многое сделать, и такие вещи, как оптимизация кэша, иногда можно выполнять и на уровне Pascal (см., Например, Оптимизация кэша вращающихся растровых изображений )

...