2010-11-05 12 views
8

¿Alguien tiene alguna sugerencia para las herramientas de análisis de archivos de ensamblaje? Estoy intentando analizar archivos ASM ARM/Thumb-2 generados por LLVM (o alternativamente GCC) cuando pasan la opción -S. Estoy particularmente interesado en las estadísticas de instrucción en el nivel de bloque básico, p. el recuento de la operación de la memoria, etc. Podría terminar enrollando mi propia herramienta en Python, pero tenía curiosidad por ver si había alguna herramienta existente antes de comenzar.Herramientas de análisis de ensamblaje

Actualización: He hecho un poco de búsqueda, y encontré un buen recurso para desmontar herramientas/editores hexadecimales/etc here, pero lamentablemente se centra principalmente en el ensamblaje x86 y tampoco incluye ningún analizador de archivos de ensamblaje .

+0

Creo que es más fácil analizar el LLVM IR ya que utiliza el formulario de SSA para los registros. – delnan

+0

@delnan Estoy de acuerdo, pero estoy agregando un pase de optimización de nivel de ensamblaje, por lo que debo ser capaz de analizar el ASM real generado. – Zeke

+0

¿Puedo sugerir que su pase funcione como un LLVM MachineFunctionPass o si es absolutamente necesario dentro de la infraestructura de MC? Realmente no hay ninguna razón para analizar el asm, reconstruir toda la información de control y flujo de datos, y luego hacer algo de optimización. – ohmantics

Respuesta

2

Lo que necesita es una herramienta para la que pueda definir una sintaxis del lenguaje ensamblador y luego crear analizadores personalizados. Sus analizadores pueden ser simples ("¿cuánto espacio ocupa una instrucción?") O complejos ("¿Cuántos ciclos tardará en ejecutarse esta instrucción?" [Que depende de la secuencia de instrucciones anterior y posiblemente de un modelo sofisticado del procesador que preocuparse]).

Uno diseñado específicamente para hacer eso es el New Jersey Machine Toolkit. Está realmente diseñado para construir generadores de código y depuradores. Sospecho que sería bueno en "conteo de bytes de instrucción". No está claro que sea bueno en análisis más sofisticados. Y creo que insiste en que siga su estilo de sintaxis, en lugar del suyo.

Uno no diseñado específicamente para hacer eso, pero bueno para analizar/analizar langauges en general es nuestro DMS Software Reengineering Toolkit.

DMS se puede dar una descripción gramatical para prácticamente cualquier idioma sin contexto (que cubre la sintaxis del lenguaje ensamblador) y luego analizar una instancia específica de esa gramática (código ensamblador) en AST para su posterior procesamiento. Hemos terminado con varios lenguajes de ensamblaje, incluida la IBM 370, la línea de CPU de 8 bits de Motorola, y un DSP bastante peculiar, sin problemas.

Puede especificar fácilmente una gramática de atributo (cálculo sobre un AST) a DMS. Estas son excelentes maneras de codificar análisis que necesitan solo información local, como "¿Qué tan grande es esta instrucción?". Para un análisis más complejo, necesitará un modelo de procesador impulsado por una serie de instrucciones; Pasar tal modelo de máquina a los AST para instrucciones individuales sería una manera fácil de aplicar un modelo de máquina para calcular cosas más complejas como "¿Cuánto tiempo lleva esta instrucción?".

DMS proporciona otros análisis como flujo de control y flujo de datos en forma genérica. Puede usar un evaluador de atributos para recopilar datos locales ("control-siguiente para esta instrucción es ...", "los datos de esta instrucción fluyen a ...") y alimentarlos a los analizadores de flujo para calcular hechos de flujo global ("si ejecuto esta instrucción, ¿qué otras instrucciones se pueden ejecutar en sentido descendente?" ..)

Debe configurar el DMS para su idioma particular (de ensamblaje). Es diseñado para ser configurado para tareas como estas.

Sí, es probable que pueda codificar todo esto en Python; después de todo, es una máquina de Turing. Pero probablemente no sea tan fácil.

Un beneficio adicional: DMS está dispuesto a aplicar transformaciones a su código, en función de sus análisis. Por lo tanto, podría implementar su optimizador también. Después de todo, debe conectar la indicación de análisis, la optimización es segura, a los pasos de optimización reales.

+0

Gracias por los enlaces y la fascinante TechTalk. Creo que el DMS puede ser excesivo para mi situación particular, pero el concepto en sí es muy interesante. ¿Qué tan empinada es la curva de aprendizaje cuando se usa DMS? – Zeke

+0

DMS es un sistema complejo porque trata con artefactos complicados, y hace algunas cosas bastante complejas (el análisis de flujo en 25 millones de líneas de código C requiere una maquinaria bastante sorprendente). Puedes aprender los conceptos básicos en una semana; echa un vistazo a http://www.semanticdesigns.com/Products/DMS/SimpleDMSDomainExample.html para un recorrido rápido de los conceptos básicos. Probablemente tome entre 6 y 12 meses para convertirse en * bueno * al usar DMS; piense en la curva de aprendizaje para ser bueno en el uso de C++. Esa podría no ser la forma correcta de pensar sobre DMS; la verdadera pregunta es, ¿cuánto tiempo llevaría hacer la misma tarea sin? –

+0

parece que no es gratuito, por lo tanto, puede no ser adecuado para proyectos personales/proyectos de software libre. ¿O estoy confundiendo y me perdí el enlace "descargar"? Aunque parece una herramienta genial. –

2

He escrito muchos desensambladores, incluidos el brazo y el pulgar.No es calidad de producción sino con el propósito de aprender el ensamblador. Tanto para ARM como para Thumb, el ARM ARM (ARM Architectural Reference Manual) tiene un buen cuadro desde el cual puede contar fácilmente las operaciones de datos desde la carga/almacenamiento, etc., tal vez una hora de trabajo, tal vez dos. Al menos por adelantado, terminarías contando los valores de los datos.

El otro póster puede estar en lo cierto, ya que con el cuadro del que estoy hablando debe ser muy simple escribir un programa para examinar el ASCII buscando ldr, str, add, etc. No hay necesidad de analizar todo si es interesado en recuentos de operaciones de memoria, etc. Por supuesto, la desventaja es que es probable que no pueda examinar los bucles. Una función puede tener una carga y almacenamiento, otra puede tener una carga y almacenamiento, pero debe estar envuelta por un bucle, lo que ocasiona muchas más operaciones de memoria una vez que se ejecuta.

Sin saber lo que realmente le interesa, supongo que es posible que desee simular el código y contar este tipo de cosas. Escribí un simulador de pulgar (thumbulator) que intenta hacer precisamente eso. (y lo he usado para comparar la ejecución de llvm contra la ejecución de gcc cuando se trata del número de instrucciones ejecutadas, de recuperaciones, de operaciones de memoria, etc.) El problema puede ser que solo es pulgar, no ARM no Thumb2. Thumb2 podría agregarse más fácilmente que ARM. Existe un brazo armador del brazo, que está en las fuentes gdb entre otros lugares. No puedo recordar ahora si ejecuta thumb2. Según tengo entendido, cuando el brazo estaba usando esto te diría exactamente este tipo de estadísticas.

+0

¿No lo llamaste "Thimbleulator"? –

1

Puede conectar sus estadísticas en el generador de código LLVM, es bastante flexible y ya está recopilando algunas estadísticas, que podrían usarse como ejemplo.

Cuestiones relacionadas