PRÁCTICAS DE COMPUTADORES II

SEXTA SESIÓN


  1. Puntero de pila

    Queda aún por desvelar el significado de muchos registros del procesador. En esta sesión trabajaremos con los punteros de pila. Lo habitual en otros procesadores de la época y posteriores es que tuvieran uno o incluso ninguno (caso de los RISCs) punteros de pila. El 6809 nos ofrece dos y, si lo apuramos, incluso cuatro, pues X e Y pueden llegar a actuar como tales de un modo muy directo.

    Una pila es una estructura de datos con dos operaciones, PUSH (empujar, meter) y PULL (extraer, sacar). La operación PUSH almacena un dato en la pila. La operación PULL extrae un dato de la pila. La condición para que sea una pila es que el dato extraído sea el último que se introdujo. Lo mismo que ocurre en una pila de platos de un restaurante. Los platos limpios se van colocando en la parte alta de la torre de platos. Cuando se requiere un plato, se toma de la cima de la torre. Dicho plato fue el último que se metió en la torre de platos.

    El procesador no tiene pilas como tales, sino punteros (o apuntadores) de pilas. El puntero S es el puntero del sistema y se verá afectado por otras operaciones del procesador como veremos en sesiones posteriores. El puntero U está a completa disposición del usuario. Trabajemos con el puntero U para ver cómo funcionan las pilas.

    Lo primero que hay que hacer es darle un valor inicial al puntero de pila. Le daremos el valor 0xF000, enseguida veremos el porqué.

    Imaginemos ahora que queremos introducir en la pila el valor del registro A. La instrucción en ensamblador es PSHU A. Veamos gráficamente cómo funciona:

    Metemos A en la pila

    El puntero de pila, como vemos, apunta siempre al último byte que se metió en la pila. Sigamos con el ejemplo para ver cómo podemos, mediante la pila, lograr el equivalente a la instrucción EXG A,B (intercambiar los registros A y B). Es evidente que es preferible dicha instrucción, pues es más rápida. Se pone aquí a modo de ejemplo:

    Continuación del ejemplo

    Con este ejemplo habréis observado que la pila crece siempre hacia las direcciones bajas, que no es obligatorio sacar de la pila al mismo registro que se metió y que, cuando algo sale de la pila no se pierde el tiempo en borrarlo de la memoria, simplemente se incrementa el puntero.

    En nuestro simulador, el valor inicial de los registros es cero. En un caso real, no tiene por qué ser así. Esto, unido al hecho de que si dejamos la pila en el 0x0000, puede empezar a crecer hacia abajo y machacarnos las direcciones peligrosas de 0xFF00, 0xFF01 y 0xFF02, hacen que un buen lugar para iniciarla en nuestro sistema sea ese 0xF000 que hemos puesto.

  2. Ejercicio

    Con ayuda de una pila, admítanse caracteres del teclado hasta que el usuario pulse la tecla Intro ('\n). En ese momento, se imprimirán por la pantalla los caracteres tecleados en orden inverso.

    Pruébese el programa con los famosos palíndromos en español: "RECONOCER", "ACURRUCA", "DABALE ARROZ A LA ZORRA EL ABAD".

  3. Operaciones múltiples

    El código máquina del 6809 permite almacenar varios registros en la pila de una sola operación. Los registros siempre se almacenan en un determinado orden, no importando en qué orden se pusieron en la instrucción en ensamblador. El orden es PC, U/S, Y, X, DP, B, A y CC. En la pila U se puede almacenar el registro S y en la pila S el registro U, pero no se puede almacenar en una pila el propio puntero de pila. Veamos un ejemplo:
    Metemos A, S e Y en la pila

    Esta operación es funcionalmente equivalente a estas tres, justo en este orden: PSHU S, PSHU Y, PSHU A.

    Uno de los usos más frecuentes de las pilas en ensamblador consiste en salvaguardar en la pila los valores de los registros para poder operar con ellos y restaurar su valor con órdenes PULLs cuando se haya acabado. Imaginemos que, en el caso anterior, hemos estado operando con los registros A, S e Y y ha quedado basurilla en ellos y queremos recuperar su antiguo valor. Usamos la instrucción PULU:

    Sacamos A, S e Y de la pila

    Notad que la instrucción PULU A,S,Y es equivalente a estas tres: PULU A, PULU Y, PULU S, exactamente en ese orden que es, además, inverso al orden en que se metieron en la pila. De todos estos detalles se encarga la propia instrucción PULU si metéis varios registros a la vez.

    Otros usos tradicionalmente dados a las pilas son el manejo de subrutinas y la creación de variables locales o temporales. De ambos asuntos trataremos sobradamente en sesiones venideras.

  4. Ejercicio

    Con el auxilio de una pila, prográmese el siguiente detector de sintaxis correcta:
    1. El usuario tecleará una línea de texto acabada en salto de línea
    2. La línea puede contener caracteres alfanuméricos, espacios, signos de puntuacioón y los tres tipos de paréntesis: (, ), [, ], {, }.
    3. El programa recorrerá los caracteres introducidos. Los irá imprimiendo por la pantalla hasta detectar un error de sintaxis o, en caso de que sea una entrada correcta, hasta el final.
    4. Se considera sintaxis correcta aquella que para los tres tipos de paréntesis por separado hay igual número de aperturas que de cierres y, además, solamente puede haber un cierre si el paréntesis más cercano hacia atrás es una apertura del mismo tipo.

    Ejemplo de entradas correctas:

    Ejemplo de entradas incorrectas:

    Pista: en la pila se van guardando las aperturas y, cuando llega un cierre, se saca de la la pila la última apertura guardada. Si no coinciden, hay error de sintaxis. Si coinciden, se prosigue.

  5. Órdenes de ensamblador vistas.

    PSHx
    introduce en la pila x la lista de registros que se especifica como operando. En la lista debe aparecer una vez como máximo cualquiera de estos registros: PC, U/S, Y, X, DP, B, A y CC. El orden en que se meten en la pila será ese y no el que se indique en la lista. No se puede meter U en U o S en S. x pueden ser U o S
    Flags afectados: ninguno
    PULx
    saca de la pila x la lista de registros que se especifica como operando. En la lista debe aparecer una vez como máximo cualquiera de estos registros: CC, A, B, DP, X, Y, U/S y PC. El orden en que se sacan de la pila será ese y no el que se indique en la lista. No se puede sacar U de U o S de S. x pueden ser U o S
    Flags afectados: solamente si se saca CC de la pila


  6. Órdenes de la shell relacionadas.

    ls
    lista el contenido de un directorio
    cd
    cambia el directorio de trabajo
    rm
    borra un fichero
    man
    muestra la página de manual de una orden
    cat
    muestra el contenido de un fichero
    echo $?
    muestra el código devuelto por el último programa ejecutado


  7. LPEs.


© 2010 Guillermo González Talaván.