Pregunta Buenos recursos para usar Assembly en Delphi?


Pregunta

¿Hay algún recurso para aprender a usar el ensamblaje en Delphi?

Información de fondo

He encontrado y leído algunas referencias generales del conjunto de instrucciones y ensamblaje (x86, MMX, SSE, etc.). Pero me resulta difícil aplicar esa información en Delphi. Cosas generales como cómo obtener el valor de una propiedad de clase, etc.

Me gustaría tener el opción para usar ensamblaje al optimizar el código.

Entiendo:

  • Será difícil vencer al compilador.
  • Es mucho más probable que las técnicas de optimización de alto nivel aumenten el rendimiento en varios órdenes de magnitud sobre las optimizaciones de ensamblaje de bajo nivel. (Como elegir diferentes algoritmos, almacenamiento en caché, etc.)
  • La creación de perfiles es vital. Estoy usando Sampling Profiler para análisis del rendimiento en el mundo real y recuentos de ciclos de CPU para detalles de bajo nivel.

Estoy interesado en aprender a usar el ensamblaje en Delphi porque:

  • No puede doler tener otra herramienta en la caja de herramientas.
  • Ayudará a comprender el resultado del conjunto generado por el compilador.
  • Comprender qué está haciendo el compilador puede ayudar a escribir un mejor código pascal.
  • Soy curioso.

7
2017-08-17 01:37


origen


Respuestas:


Aquí hay un recurso que podría ser útil ...

www.guidogybels.eu/docs/Using%20Assembler%20in%20Delphi.pdf

(Quería agregar un comentario a @Glenn con esta información, pero estoy forzado a usar el mecanismo de Contestar como soy nuevo en este foro y no hay suficientes representantes ...)


12
2017-08-17 12:42



La mayoría de la optimización implica la creación de mejores algoritmos: generalmente es donde se puede obtener el 'orden de magnitud', se pueden obtener mejoras de velocidad.

El mundo de ensamblaje x64 es un gran cambio en el mundo de ensamblaje x86. Lo que significa que con la introducción de x64 en Delphi en XE2 (muy pronto), tendrás que escribir todo tu código de ensamblado dos veces.

Obtener un mejor algoritmo en Delphi lo alivia de escribir ese código ensamblador.

El área principal donde el ensamblaje puede ayudar (pero a menudo el código Delphi inteligentemente diseñado también ayuda) es un juego de bits / byte de bajo nivel, por ejemplo cuando se realiza el cifrado. Por otra parte FastMM (el administrador de memoria rápida para Delphi) tiene casi todo el código escrito en Delphi.

Como Macro ya escribió: comenzar con el código desensamblado suele ser un buen comienzo. Pero las optimizaciones de ensamblaje pueden llegar muy lejos.
Un ejemplo que puede usar como punto de partida es, por ejemplo, el Unidad SynCrypto que tiene una opción para usar Delphi o código ensamblador.


6
2017-08-17 04:43



La forma en que leo su publicación, no busca tanto los recursos de ensamblador como recursos para explicar cómo las declaraciones de Delphi están estructuradas en la memoria para que pueda acceder a ellas a través del ensamblador. Esto es de hecho algo difícil de encontrar, pero no imposible.

aquí es un buen recurso que he encontrado para comenzar a entender cómo Delphi estructura sus declaraciones. Como el ensamblador solo se involucra con direcciones de datos discretas para los tipos de datos definidos por la CPU, estará bien con cualquier estructura Delphi siempre que la entienda y acceda a ella correctamente.

La única otra preocupación es cómo interactuar con el procedimiento Delphi y los encabezados de funciones para obtener los datos que desea (suponiendo que desee hacer su ensamblador usando el recurso en línea Delphi), pero eso solo implica la comprensión de las convenciones de llamadas a funciones estándar. Esta y esta será útil para ese fin en la comprensión de esos.

Ahora usar ensamblador real (archivos OBJ vinculados) en comparación con el ensamblador en línea es otro tema, que variará dependiendo del ensamblador elegido. Puede encontrar información sobre eso también, pero si tiene un interés siempre puede hacer esa pregunta también.

HTH.


5
2017-08-17 05:50



Para utilizar BASM de manera eficiente, debe tener conocimiento de (1) cómo Delphi hace las cosas en un nivel bajo y (2) de ensamblaje. La mayoría de las veces, no encontrará ambas cosas descritas en un solo lugar.

Sin embargo, Dennis Christensen BASM para principiantes y esto Artículo Delphi3000 ir en esa dirección. Para preguntas más específicas, además de Stackoverflow, también Embarcadero's Foro BASM es bastante útil.


4
2017-08-17 08:25



La solución más simple es siempre codificarla en pascal, y observar el ensamblador generado.

Speedwise, el ensamblador normalmente solo tiene una ventaja en bucles ajustados y, en general, el código apenas mejora, si corresponde. Tengo solo una pieza de ensamblador en mi código, y el beneficio proviene de la recodificación de una operación de vector de coma flotante en punto fijo SSE. La saturación proporcionada por los juegos de instrucciones SIMD es una ventaja adicional.

Peor aún, el código de ensamblador mucho menos recomendable que flota en la web es en realidad más lento que los equivalentes pascales en los procesadores modernos porque las compensaciones de los procesadores cambiaron con el tiempo.


Actualizar:

Luego, simplemente cargue la propiedad class en una var local en el prólogo de su procedimiento antes de ingresar al ciclo ensamblador, o mueva el ensamblador a un procedimiento diferente. Elige tus batallas.

Estudiar la fuente RTL / VCL también podría arrojar ideas sobre cómo acceder a ciertos constructos.

Por cierto, no todas las optimizaciones de bajo nivel se realizan con el ensamblador. En el nivel de Pascal con algunos conocimientos de puntero, también se puede hacer mucho, y cosas como la optimización de caché a veces también se puede hacer en el nivel de Pascal (ver p. Optimización de caché de bitmaps rotativos )


2
2017-08-17 02:09