2009-08-20 29 views
8

Soy muy nuevo en el concepto de escribir un ensamblador e incluso después de leer una gran cantidad de material, sigo teniendo dificultades para entender un par de conceptos.Escribiendo un ensamblador Z80 - lexing ASM y construyendo un árbol de análisis mediante composición?

  1. ¿Cuál es el proceso para dividir realmente un archivo fuente en tokens? Creo que este proceso se llama lexing, y busqué un código real que tenga sentido, pero no encuentro nada. Ejemplos de código muy simples muy bienvenidos;)

  2. Cuando se analiza, no ¿Alguna vez se debe pasar la información arriba o abajo del árbol? La razón que pido es el siguiente, tome:

    LD BC, nn

Tiene que ser convertido en el siguiente árbol de análisis sintáctico vez tokens (???)

___ LD ___ 
    |  | 
BC  nn 

Ahora , cuando se recorre este árbol que necesita para producir el siguiente código de máquina:

01 n n 

Si la instrucción había sido:

LD DE,nn 

A continuación, la salida tendría que ser:

11 n n 

Lo que significa que plantea la pregunta, ¿el retorno LD nodo algo diferente basado en el operando o es el operando que devuelve algo? ¿Y cómo se logra esto? Los ejemplos de código más simples serían excelentes si el tiempo lo permite.

Estoy muy interesado en aprender algunos de los procesos en bruto aquí en lugar de mirar las herramientas avanzadas existentes así que tenlo en cuenta antes de enviarme a Yacc o Flex.

Respuesta

8

Bueno, la estructura del árbol que realmente desea para una instrucción que opera en un registro y un modo de direccionamiento de memoria involing un desplazamiento de compensación y un registro de índice se vería así:

INSTRUCTION-----+ 
    |  |  | 
    OPCODE REG  OPERAND 
        |  | 
       OFFSET INDEXREG 

Y sí, quieres querer pasar los valores arriba y abajo del árbol. Un método para especificar formalmente tal paso de valores se llama "gramáticas de atributos", y usted decora la gramática de su idioma (en su caso, la sintaxis de su ensamblador) con el valor de y los cálculos sobre esos valores. Para obtener más antecedentes, ver Wikipedia on attribute grammars.

En un related question you asked, hablé de una herramienta , DMS, que se ocupa de las gramáticas de expresión y árboles de construcción.Como herramienta de manipulación de lenguaje , DMS se enfrenta exactamente a estos mismos problemas de flujo de información de árbol . No debe sorprenderle, que, como herramienta de manipulación del lenguaje de alta gama, puede manejar cálculos de gramática de atributos directamente.

+1

Esto estaba destinado a ser ilustrativo de los árboles que necesita construir, en lugar de coincidir con una instrumentación Z80 específica. Codifiqué MUCHOS ensambladores Z80 en la década de 1980; Es posible que sepa más sobre eso de lo que piensas. –

+0

Luego demuestre su conocimiento. ¿Has escrito un ensamblador Z80? No lo he hecho, pero he escrito ensambladores 8080 y 6809, y su consejo me parece totalmente erróneo. –

+0

Tu experiencia es probablemente diferente a la mía. He codificado ensambladores para la Collins 8311 (circa 1968), una máquina de 12 y 16 bits que no funcionaba comercialmente, por lo que no has oído hablar de ellos, los ensambladores de microcódigo y el ensamblador 6809 que viste en el otro mensaje. También he creado una variedad de interfaces para compiladores (mira mi información biográfica y el sitio web). Mis primeros ensambladores fueron construidos por medios ad hoc y funcionó. Cosas que construí desde los años 80 usando lexers y analizadores porque es mucho más fácil especificar, mantener, extender, lo que sea. –

5

No es necesario crear un árbol de análisis. Los códigos de operación Z80 son muy simples. Consisten en el código de operación y 0, 1 o 2 operandos, separados por comas. Solo necesita dividir el código de operación en el (máximo de 3) componentes con un analizador muy simple: no se necesita ningún árbol.

+0

¿Qué pasa con las direcciones de memoria relativa> seguramente se necesita algún tipo de árbol simbólico para esto? quizás incluso una tabla – Darknight

+0

El interlocutor preguntaba por el análisis de los códigos OP. Sin duda necesita una tabla de símbolos para ayudar a crear el resultado del código de máquina real del ensamblador, pero ese es un problema completamente diferente. –

+0

@Darknight: ¿Todavía no habría un punto válido para crear un árbol de análisis sintáctico. Por ejemplo, otras apariciones podrían desempeñar una función, como aquí hay algunas cadenas de código ASM que tienen variaciones en la sintaxis: Etiquetas, Comentarios, Corchetes, Variables globales, .DB, .DS, .DW ¿No serían estos también más simplificado si se utilizó un árbol de análisis sintáctico @Neil: ¿Podría dar más detalles? Saludos, GP –

3

En realidad, los opcodes no tienen una base de bytes, sino una base octal. La mejor descripción que sé es DECODING Z80 OPCODES.

+0

Ya, a la derecha. Octal le permite traducir directamente, y una llamada recursiva puede tratar con los registros de compensación. Uno no necesita construir un árbol de sintaxis en absoluto. Cada instrucción y se mapeará directamente. – EvilTeach

Cuestiones relacionadas