c# - tablas - Construyendo un ensamblador
tabla de microcontroladores (4)
Si va a escribir un ensamblador que simplemente funciona, y escupe un archivo hexadecimal para cargarlo en un microcontrolador, puede ser simple y fácil. Parte de mi biblioteca ciforth es un ensamblador Pentium completo para agregar definiciones en línea, de aproximadamente 150 líneas. Hay un ensamblador para el 8080 de un par de docenas de líneas.
El principio se explica http://home.hccnet.nl/awmvan.der.horst/postitfixup.html . Esto equivale a aplicar el patrón de diseño de la pizarra al problema. Empiezas por establecer las instrucciones, dejando agujeros para todos y cada uno de los operandos. Luego llenas los agujeros, cuando encuentras los parámetros.
Hay una separación estricta entre la herramienta genérica y el conjunto de instrucciones.
En caso de que el ensamblador que necesita sea solo para usted, y no hay requisitos que la usabilidad (no una tarea), puede tener una implementación de ejemplo en http://home.hccnet.nl/awmvan.der.horst/forthassembler. html . Si no le gusta Forth, también hay una implementación de ejemplo en Perl. Si el conjunto de instrucciones Pentium es demasiado masticable, entonces aún debe ser capaz de comprender el principio y la parte genérica. Le recomendamos que primero eche un vistazo al archivo asi8080.frt . Esto es 389 WOC (Palabras de código, no líneas de código). Un Forther experimentado familiarizado con el conjunto de instrucciones puede poner en marcha un ensamblador así en una tarde. El Pentium es una perra
Necesito construir un ensamblador para una arquitectura de CPU que he creado. La arquitectura es similar a MIPS, pero esto no tiene importancia.
Empecé a usar C #, aunque C ++ sería más apropiado. (C # significa un tiempo de desarrollo más rápido para mí).
Mi único problema es que no puedo ofrecer un buen diseño para esta aplicación. Estoy construyendo un ensamblador de 2 pasos. Sé lo que debo hacer en cada pase.
Implementé el primer pase y me di cuenta de que si tenía que alinear el código de ensamblado en la misma línea ... no se produce ningún error. Esto significa solo una cosa: técnicas de análisis deficientes.
Así que programadores todopoderosos, padres de ensambladores me explican cómo debo proceder. Solo necesito apoyar símbolos y declaración de datos. Las instrucciones tienen un tamaño fijo.
Por favor, avíseme si necesita más información.
He escrito tres o cuatro ensambladores simples. Sin usar un generador de analizador sintáctico, lo que hice fue modelar el ensamblador SC que mejor conocía para 6502.
Para hacer esto, utilicé una sintaxis simple: una línea era una de las siguientes:
nothing
[label] [instruction] [comment]
[label] [directive] [comment]
Una etiqueta era una letra seguida de cualquier cantidad de letras o números.
Una instrucción era <whitespace> <mnemonic> [operandos]
Una directiva era <whitespace> .XX [operandos]
Un comentario fue un * hasta el final de la línea.
Los operandos dependen de la instrucción y la directiva.
Directivas incluidas .EQ equivale para definir constantes
.O establecer la dirección de origen del código
.HS cadena hexadecimal de bytes
.AS ascii cadena de bytes - cualquier delimitador excepto espacio en blanco - lo que sea que lo haya iniciado lo terminó
.TF archivo de destino para salida
.BS n reserva de almacenamiento en bloque de n bytes
Cuando lo escribí, escribí analizadores simples para cada componente. Cada vez que encuentro una etiqueta, la pongo en una tabla con su dirección de destino. Cuando encontré una etiqueta que no sabía, marqué la instrucción como incompleta y puse la etiqueta desconocida con una referencia a la instrucción que necesitaba corrección.
Después de que todas las líneas de origen pasaron, miré a través de la tabla "para arreglar" e intenté encontrar una entrada en la tabla de símbolos, si lo hacía, parché las instrucciones. Si no, entonces fue un error.
Mantuve una tabla con los nombres de las instrucciones y todos los modos de direccionamiento válidos para los operandos. Cuando recibí una instrucción, traté de analizar cada modo de direccionamiento por turno hasta que algo funcionó.
Dada esta estructura, debería tomar un día tal vez dos para hacer todo.
La primera pasada de un ensamblador de dos pasos ensambla el código y coloca marcadores de posición para los símbolos (ya que no se sabe qué tan grande es todo hasta que haya ejecutado el ensamblador). El segundo pase completa las direcciones. Si el código ensamblado posteriormente debe vincularse a referencias externas, este es el trabajo del vinculador del mismo nombre.
Mire este Kit de desarrollo de ensamblador del autor de Randy Hyde del famoso "El arte del lenguaje ensamblador":