2011-08-17 20 views
7

Pregunta¿Buenos recursos para usar Assembly en Delphi?

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

Antecedentes

que he encontrado y leído algunos de la Asamblea General y del conjunto de instrucciones referencias (x86, MMX, SSE, etc). Pero me resulta difícil aplicar esa información en Delphi. Aspectos generales, como cómo obtener el valor de una propiedad de clase, etc.

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

entiendo:

  • será difícil de batir el 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 el análisis del rendimiento en el mundo real y recuentos de ciclo de CPU para detalles de bajo nivel.

estoy interesado en aprender cómo utilizar el montaje en Delphi porque:

  • No se pierde nada con tener una herramienta más en la caja de herramientas.
  • Esto ayudará a comprender la salida del conjunto generado por el compilador.
  • Entender lo que hace el compilador puede ayudar a escribir un mejor código pascal.
  • Tengo curiosidad.
+3

Solo escribirlo en ensamblaje, no lo hará más rápido. Escribirlo en ensamblaje de una manera más inteligente/más rápida que el compilador pensó, podría. Es probable que la funcionalidad de obtener una propiedad de clase no ocupe su tiempo; es probable que las manipulaciones sobre el valor de la propiedad sean lo que desea intentar en el ensamblaje. – PtPazuzu

+2

No creo que haya libros Delphi-plus-assembler. Tomaría los valores de las propiedades de la clase, usando el código pascal normal, almacenando el resultado en una variable local, y luego usaría la referencia de variable local en mi ensamblador en línea, por ejemplo. Pregunta relacionada para libros generales sobre X86 asm; http: //stackoverflow.com/questions/4845/good-x86-assembly-book –

+0

@PtPazuzu: Sí, la manipulación de valores es el objetivo. Pero ayudaría a entender lo básico primero. En definitiva, estoy buscando SSE como una fuente de posibles aceleraciones. Delphi no aprovecha las instrucciones de SSE en absoluto, ¿verdad? – Shannon

Respuesta

12

Aquí es un recurso que puedan ser de utilidad ...

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

(que quería añadir un comentario a @Glenn con esta información, pero veo obligado a utilizar el mecanismo de respuesta como soy nuevo en este foro y no suficientes representantes ...)

+1

Gracias @daemon! –

+1

+1 por mencionar este excelente artículo. No esperaba que todavía estuviera en línea, ya que Guido ya no parece estar usando Delphi. –

2

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

Speedwise, el ensamblador normalmente solo tiene un plus en bucles apretados, y en general el código apenas mejora, si existe. 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 incluso, código de ensamblador mucho mal aconsejado 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.


Actualización:

A continuación, basta con cargar una propiedad de clase en una var en el prólogo de su procedimiento antes de entrar en el bucle ensamblador, o mover el ensamblador a un procedimiento diferente. Elige tus batallas.

Estudiar fuente RTL/VCL también puede dar ideas sobre cómo acceder a ciertas construcciones.

Por cierto, no todas las optimizaciones de bajo nivel se realizan con el ensamblador.En el nivel Pascal con algunos conocimientos de punteros se puede hacer mucho, y cosas como la optimización del caché a veces también se puede hacer a nivel Pascal (ver p.ej. Cache optimization of rotating bitmaps)

+0

No estoy interesado en el ensamblador para el código general. Mis aplicaciones procesan audio en tiempo real. A menudo uso bucles apretados cuando trabajo con los datos de audio en sí. Dependiendo de la aplicación real, pretendo menos del 2-5% de uso de la CPU en una CPU moderna (solo en las secciones en tiempo real, no me importa tanto el uso de la CPU durante las secciones que no son en tiempo real). Todas las "optimizaciones" también están marcadas en el banco. No aplico ciegamente nada. – Shannon

+0

Con la nueva información actualicé mi respuesta un poco. –

+0

Gracias Marco. Esa lectura de optimización de caché es interesante. +1 – Shannon

6

La mayor parte de la optimización implica crear mejores algoritmos: generalmente es donde puedes obtener Se pueden obtener mejoras en la velocidad de "orden de magnitud".

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á que escribir todo el código de ensamblaje dos veces.

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

El área principal donde el ensamblaje puede ayudar (pero a menudo el código Delphi inteligentemente diseñado también ayuda) es un nivel bajo de bits/byte, por ejemplo cuando se realiza el cifrado. Por otro lado, 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 es a menudo 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 SynCrypto unit que tiene una opción para usar Delphi o código ensamblador.

+0

+1 para "La mayor optimización implica crear mejores algoritmos": esta es la regla principal. –

+0

Entiendo que la optimización generalmente se realiza mejor a través de medios de alto nivel, como las opciones de algoritmo, pero no creo que eso revierte el valor de saber cómo usar el ensamblado en Delphi. – Shannon

+0

Quizás el mejor beneficio en la creación de código de ensamblador no tiene que ver con el algoritmo en sí (por ejemplo, una conexión rápida incorrecta supera una clasificación de burbuja totalmente optimizada cada vez). Lo que tiene que hacer es cómo se expresa ese algoritmo. Por ejemplo, puede usar instrucciones de la CPU (incluso x86) que Delphi no utiliza si se requieren (ADC es un gran ejemplo). O codificas de tal forma que conserves cualquier variable en los registros. E incluso si no codifica en ensamblador, conocerlo puede ser útil para hacer un código Delphi más rápido. – Glenn1234

5

La forma en que leo su publicación, no está buscando tanto recursos de ensamblador como recursos para explicar cómo las declaraciones 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.

Here 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 función para obtener los datos que desea (suponiendo que desea hacer su ensamblador utilizando el recurso en línea Delphi), pero eso solo implica la comprensión de la función estándar llamada convenciones. This y this serán útiles para ese fin en la comprensión de los mismos.

Ahora usar el ensamblador real (archivos OBJ vinculados) en lugar del 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.

+0

¡Gracias Glenn! ¡Este es exactamente el tipo de información que busco! – Shannon

+0

¿Hay ventajas al usar archivos OBJ vinculados sobre el ensamblaje en línea? (¿Debería ser esta otra pregunta?) – Shannon

+0

@Shannon Según tengo entendido, la principal ventaja es que puede obtener soporte para las instrucciones en el "ensamblador real" que es posible que no obtenga en el ensamblador en línea Delphi. Por extraño que parezca, nunca tuve problemas para invocar llamadas a funciones de ensamblador "reales". Solo depende de si obtienes algo que necesitas del producto ensamblador que no puedes obtener de Delphi. – Glenn1234

4

Para usar BASM de manera eficiente, necesita tener un 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, BASM for beginner de Dennis Christensen y este Delphi3000 article van en esa dirección. Para preguntas más específicas, además de Stackoverflow, también es útil el BASM forum de Embarcadero.

Cuestiones relacionadas