sábado, 1 de diciembre de 2012

Tercera fase del ensamblador

En la tercera fase tenemos que analizar el segmento de datos.
Las especificaciones son las siguientes:


La Fase 3 del proyecto cubre la fase del análisis sintáctico y semántico de los segmentos de datos y pila, es decir, analizar los elementos que integran las líneas del programa fuente que se encuentran en las definiciones de los segmentos de datos y pila para verificar que son los correctos y que están en el orden correcto, conforme a la siguiente sintaxis.

data segment (pseudoinstrucción que identifica el inicio de la definición del segmento de datos)
símbolo db constante caracter
símbolo db constante numérica byte
símbolo db constante numérica dup (constante caracter byte)
símbolo db constante numérica dup (constante numérica byte)
símbolo dw constante numérica palabra
símbolo dw constante numérica palabra dup(constante numérica palabra)
símbolo equ constante numérica palabra
ends (pseudoinstrucción que identifica el fin de la definición de un segmento)

stack segment (pseudoinstrucción que identifica el inicio de la definición del segmento de pila)
dw constante numérica palabra dup(constante numérica palabra)
ends (pseudoinstrucción que identifica el fin de la definición de un segmento)

Esta fase del proyecto debe cubrir la característica de desplegar la línea del programa fuente analizada y frente a ella el resultado de la verificación con la frase Correcta o Incorrecta, según sea el caso.

En esta fase del proyecto se debe comenzar a llenar la tabla de símbolos (considerar el llenado de los cambos símbolo, tipo, valor y tamaño).

Esta fase es relativamente fácil...

Lo único que tenemos que hacer es:

Leer cada una de las líneas del archivo.
Analizar la secuencia arriba mostrada, y determinar si es correcta o incorrecta.

En un principio parecía que las fases no iban a servir demasiado... Pero no es así, bien podemos darle uso.

¿Recuerdan el Separador Simple y nuestro mapa de Strings? Pues simplemente vamos a utilizar los elementos que regrese la función del separador [en mi caso un vector de Strings] y compararlos con el mapa de strings.

Vamos a plantear una bandera que determine cuándo es que se abre y cuándo se cierra un segmento dado, ya sabemos que no puede haber más de 1 definición de cada uno así que podemos controlarla con un simple entero.

0 es que no ha habido ninguna definición, 1 que ya se inicio el segmento de datos, 2 que ya se cerró, 3 que inicio segmento de pila, 4 que se cerró, 5 que inició segmento de código y 6 que se cerró.

Esto corresponde al ciclo del data segment....

En pseudocódigo...

Si línea leída es "data segment"
    estado=1
Si no
    seguir leyendo líneas.

Si estado=1 y lineaLeida != vacío.
    si primer elemento es símbolo.
        si segundo elemento es db
            si tercer elemento es un número entero o una serie de caracteres...
                imprime linea es correcta.
                si es un entero y después existe un dup(...)
                    si el dup está bien formulado.
                        escribe linea es correcta
                    si no
                        imprime linea es incorrecta
            si no
                imprime linea es incorrecta
        si es dw
            si la definicion del elemento es correcta
                imprime linea es correcta.
            si no
                imprime linea es incorrecta.
        otro
            imprime linea es incorrecta

Verificar si es db implica comprobar tanto que el número de veces que se desea duplicar un elemento es válido, como los elementos que se desean duplicar.

    VAR5 db 5 dup('(')
Es correcta

    VAR5 db a dup('(')
Es incorrecta

Bien, el diseño de esto es simple, vamos a crear una clase que reciba un elemento y nos devuelva su tamaño...

Es decir, si enviamos "Ya voy amigos!" nos devuelva DB, y si le enviamos 50000 nos devuelva DW...
Con esto podemos comprobar dos cosas, la primera es que cuando queramos hacer un DUP se verifique que el tamaño del interior corresponda a la definición de la variable, y además, que podamos usarla con los operadores que nos asignarán en las siguientes fases del proyecto.

Nos podemos ayudar de los comprobadores de tamaño hexadecimal y decimal, ya que el ejemplo que puse antes era con signo o sin signo, podemos cambiar ese parámetro a 1 para db o 2 para dw... dependiendo cómo definimos nuestras variables estáticas en la clase del identificador, y saber si corresponde al tamaño.

No hay comentarios:

Publicar un comentario