Monografias.com > Computación > Programación
Descargar Imprimir Comentar Ver trabajos relacionados

Introducción a la máquina de Código-P




    Monografias.com

    La máquina de Código-P es similar a un computador convencional ya que consiste en un procesador y una memoria. Una diferencia fundamental es que muchas operaciones llevadas a cabo por el procesador utilizan la pila que es parte de la memoria. Por ejemplo una llamada a procedimiento supone manipular varios factores tales como parámetros y direcciones de retorno, y estos han de guardarse en la pila.

    El procesador tiene un conjunto de instrucciones definido, y así como cinco registros que tienen distintas funciones para controlar las instrucciones y las áreas de pila dentro de la memoria.

    Los registros son:

    ( PC el contador de programa (the program counter);

    ( SP el puntero de pila (the stack pointer);

    ( MP el puntero de marca de pila (the mark stack pointer);

    ( NP el puntero nuevo (the new pointer);

    ( EP el puntero de extremo de pila (the extreme stack pointer);

    El contador de programa, PC, es un puntero a la instrucción en curso. Los otros registros se usan para controlar el área de memoria restante – el almacén de datos.

    El almacén de datos está dividido en tres áreas como muestra la siguiente figura:

    Monografias.com

    El área de constantes se genera por el ensamblador y es accedida por el código.

    El "heap" decrece hacia la parte baja del almacén y el espacio libre del heap es apuntado por el puntero NP. Los datos se colocan en el heap durante una llamada al procedimiento "New" y son eliminados usando "Mark" y "Release". El área de pila tiene otra estructura interna y se usa para guardar "stack frames" (marcos de pila). Un marco de pila es generado y ubicado en la pila cada vez que un procedimiento o función es activado. El primer marco de pila es una excepción ya que éste pertenece al programa principal. El formato de la pila se muestra a continuación:

    Monografias.com

    El formato de marco de pila se muestra en la siguiente figura, esta figura también muestra el uso de los punteros MP y EP.

    Monografias.com

    El puntero de marca de pila, MP, apunta a la base del marco de pila más alto y se usa para recuperar el espacio de la pila cuando la ejecución de un procedimiento se completa y también como una base para acceder a las variables locales.El puntero de extremo de pila, EP, apunta al cima del marco de pila actual. Protege el marco de pila del NP, así que SP no tiene que ser comprobado cada vez que es incrementrado. El tamaño máximo posible de cada marco de pila se conoce en tiempo de compilación y éste se refleja en el valor de EP.

    La pila local se usa para guardar temporalmente valores durante la ejecución de un procedimiento. Por ejemplo la instrucción "sbi" toma los dos valores de la cima de la pila, los resta y retorna este valor a la pila. El puntero de la pila será ajustado para reflejar el hecho de que ahora hay un valor menos en la pila.

    El área "locals"se usa para variables que han sido declaradas dentro de un procedimiento y por tanto cuyo ámbito es local.

    Por ejemplo consideremos el siguiente procedimiento y el correspondiente Código-P:

    program locals(imput,output);

    procedure addlocal;

    var

    i:integer; (*La variable i es local al procedimiento addlocal*)

    begin

    i:=i+1

    end; (*de addlocal *)

    begin

    addlocal

    end.

    l 3 Comienzo de addlocal

    ent 1 l 4

    ent 2 l 5

    lodi 0 l 5 La variable i obtenida de la primera

    ldci l posicion por encima de la marca de pila, es decir, 5

    adi i+1

    stri 0 5 El nuevo valor de i es almacenado en 5

    retp Fin de addlocal

    l 4= 6

    l 5= 7

    l 6

    i 10

    ent 1 l 7

    ent 2 l 8

    mst 0

    cup 0 l 3 Llamada al procedimento addlocal

    retp

    l 7= 9

    l 8= 5

    q

    i 0

    mst 0

    cup 0 l 6 Se entra en el bloque del programa principal

    stp

    q

    Un parámetro de un procedimiento se transfiere desde un bloque de llamada a través el área de "parámetros" y puede ser una dirección si el parámetro es pasado por referencia o en otro caso su propio valor. El siguiente ejemplo ilustra como son pasados los parámetros:

    program params (input,output);

    var

    j: integer;

    procedure addparam(var i: integer);

    begin

    i:=i+1

    end;(*of addparam*)

    begin

    j:=1;

    addparam(j)

    end.

    l 3

    ent 1 l 4

    ent 2 l 5

    loda 0 5

    loda 0 5 La dirección de i

    indi 0 Carga indirecta del contenido de i

    ldci l

    adi

    i 10

    stoi

    retp

    l 4= 6

    l 5= 8

    ent 1 l 7

    ent 2 l 8

    ldci l

    sroi 9

    mst 0

    lao 9 Dirección de j, a ser usada como un parámetro

    cup 1 l 3 Llamada a addparam

    retp

    l 7= 10

    l 8= 6

    q

    i 0

    mst 0

    cup 0 l 6

    stp

    q

    La marca de pila se encarga de los detalles administrativos para la ejecución y retorno desde un procedimiento y para el mantenimiento de los enlaces necesarios para acceder a variables en niveles más externos.

    El "valor de una función" es simplemente un área usada para devolver al bloque llamador el valor de la función y por ello sólo se utilizan funciones. En la práctica este área debe ser capaz de mantener el valor más grande que puede ser devuelto por una función.

    El "enlace estático" se utiliza como un puntero para acceder a variables en bloques externos. El "enlace dinámico" es el valor previo de MP de tal manera que el marco de pila pueda eliminarse cuando termina la ejecución del procedimiento llamado.

    El siguiente programa ejemplo contiene un procedimiento anidado recursivo y el diagrama esquemático muestra los enlaces estáticos y dinámicos en la pila en el momento que el programa para.

    Monografias.com

    Monografias.com

    El espacio de la dirección de retorno permite que el control del programa sea devuelto por el procedimiento llamador.

    Hay tres instrucciones P-code para construir marcos de pila, "mst" ,"cup"y "ent". Las instrucciones "mst" y "cup" se utilizan antes de entrar en un procedimiento y "ent" se utiliza dos veces al entrar en un procedimiento. La operación detallada de estas instrucciones es como sigue.

    Una secuencia de llamada típica es

    mst 0

    [código para cargar parámetros]

    cup 0 l 3

    El operando de la instrucción mst (mark stack) es una indicación de la profundidad de anidamiento de el procedimiento dado y está definido como "uno más el nivel del procedimiento que llama menos el nivel del procedimiento llamado". La ejecución de mst crea valores para los enlaces estáticos y dinámicos y guarda el EP. Asigna el valor del enlace estático usando la función base para apuntar al marco de pila de el procedimiento que textualmente engloba a este. En el ejemplo anterior el enlace estático para q siempre apuntará al marco más alto para p. El enlace dinámico toma el valor actual del puntero de marca de pila (mark stack pointer) y el valor actual del puntero de extremo de pila (extreme stack pointer) se guarda. El puntero de pila (SP) se incrementa de tal manera que apunte al área de parámetros. En este momento viene el código que carga los parámetros.

    La instrucción cup (call user procedure) pone el nuevo valor de MP y el enlace para la dirección de retorno y finalmente efectúa un salto al procedimiento llamado. Al comienzo del procedimiento hay dos instrucciones ent las cuales definen el tamaño global del marco de pila y ajusta el SP y el EP como corresponde.

    ent 1 l 7

    ent 2 l 8

    Las etiquetas l 7 y l 8 apuntan a los valores a ser usados por las instrucciones ent.

    Ahora comienza la ejecución del procedimiento. La instrucción "ret" (return) proporciona el mecanismo para volver al procedimiento que llama y eliminar los marcos de pila.

    El bloque de programa principal se maneja de la misma manera que los procedimientos en lo que respecta a la pila salvo que hay cuatro posiciones reservadas por encima de la marca de pila que se usan para acceso a ficheros. Estas posiciones son direcciones fijas, y son manipuladas de la misma forma que las variables globales. Los ficheros pueden ser considerados como variables globales al programa.

    Monografias.com

    Por consiguiente, la referencia en un programa en Pascal a una variable de tipo fichero por ejemplo input^, será una referencia directa a los contenidos de uno de estas posiciones.

    Enviado por:Ing.+Lic. Yunior Andrés Castillo S.

    "NO A LA CULTURA DEL SECRETO, SI A LA LIBERTAD DE INFORMACION"®

    Santiago de los Caballeros, República Dominicana, 2016.

    "DIOS, JUAN PABLO DUARTE, JUAN BOSCH Y ANDRÉS CASTILLO DE LEÓN – POR SIEMPRE"®

     

     

     

    Autor:

    Lic. Yunior Andrés Castillo S.

    Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

    Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

    Categorias
    Newsletter