tutorial programas maquina lenguaje instrucciones explicados ensamblador ejemplos basicas assembler assembly arm grammar

assembly - programas - lenguaje maquina pdf



ARM Unified Assembler ¿Lenguaje gramatical y analizador? (1)

¿Existe una gramática o analizador disponible públicamente para el lenguaje de ensamblador unificado de ARM como se describe en ARM Architecture Reference Manual A4.2

Este documento utiliza ARM Unified Assembler Language (UAL). Esta sintaxis del lenguaje ensamblador proporciona una forma canónica para todas las instrucciones ARM y Thumb.

UAL describe la sintaxis para el mnemónico y los operandos de cada instrucción.

Simplemente estoy interesado en el código para analizar el mnemónico y los operandos de cada instrucción. Por ejemplo, ¿cómo podría definir una gramática para estas líneas?

ADC{S}{<c>}{<q>} {<Rd>,} <Rn>, <Rm>, <type> <Rs> IT{<x>{<y>{<z>}}}{<q>} <firstcond> LDC{L}<c> <coproc>, <CRd>, [<Rn>, #+/-<imm>]{!}


Si necesita crear un analizador simple basado en una gramática basada en ejemplos, nada supera a ANTLR:

http://www.antlr.org/

ANTLR traduce una especificación de gramática en código lexer y analizador. Es mucho más intuitivo de usar que Lexx y Yacc. La siguiente gramática cubre parte de lo que especificó anteriormente, y es bastante fácil de extender para hacer lo que desee:

grammar armasm; /* Rules */ program: (statement | NEWLINE) +; statement: (ADC (reg '','')? reg '','' reg '','' reg | IT firstcond | LDC coproc '','' cpreg ('','' reg '','' imm )? (''!'')? ) NEWLINE; reg: ''r'' INT; coproc: ''p'' INT; cpreg: ''cr'' INT; imm: ''#'' (''+'' | ''-'')? INT; firstcond: ''?''; /* Tokens */ ADC: ''ADC'' (''S'')? ; IT: ''IT''; LDC: ''LDC'' (''L'')?; INT: [0-9]+; NEWLINE: ''/r''? ''/n''; WS: [ /t]+ -> skip;

Desde el sitio ANTLR (instrucciones OSX):

$ cd /usr/local/lib $ wget http://antlr4.org/download/antlr-4.0-complete.jar $ export CLASSPATH=".:/usr/local/lib/antlr-4.0-complete.jar:$CLASSPATH" $ alias antlr4=''java -jar /usr/local/lib/antlr-4.0-complete.jar'' $ alias grun=''java org.antlr.v4.runtime.misc.TestRig''

Luego, en el archivo de gramática ejecutar:

antlr4 armasm.g4 javac *.java grun armasm program -tree ADCS r1, r2, r3 IT ? LDC p3, cr2, r1, #3 <EOF>

Esto produce el árbol de análisis desglosado en tokens, reglas y datos:

(programa (declaración ADCS (reg r 1), (reg r 2), (reg r 3) / n) (instrucción IT (firstcond?) / n) (declaración LDC (coproc p 3) (cpreg cr 2) (reg r 1), (imm # - 3)! / n))

La gramática aún no incluye los códigos de condición de instrucción, ni los detalles para la instrucción de TI (estoy presionado por el tiempo). ANTLR genera un lexer y un analizador sintáctico, y luego la macro grun los envuelve en una plataforma de prueba para que pueda ejecutar fragmentos de texto a través del código generado. La API generada es directa para usar en sus propias aplicaciones.

Para completar, busqué en línea una gramática existente y no encontré ninguna. Su mejor opción podría ser desmontar el gasm y extraer su especificación del analizador, pero no será la sintaxis UAL y será GPL si eso le importa. Si solo necesita manejar un subconjunto de las instrucciones, esta es una buena forma de hacerlo.