Contador de programa (PC) |
Un programa consta de una serie de instrucciones que están almacenadas secuencialmente en la memoria del sistema.
El procesador central, por tanto, va consultando el contenido de la misma a fin de determinar cuál es la operación a realizar.
Para ello, se debe tener una referencia respecto a cuál es la posición de memoria en que está contenida la próxima instrucción a ejecutar.
Cada una de estas posiciones de memoria tiene asociado un número, a fin de distinguirlas de las demás. Al número asociado que identifica una posición de memoria se le denomina DIRECCIÓN.
El contador que contiene la dirección de la siguiente posición a ejecutar se denomina CONTADOR DE PROGRAMA. El Procesador Central va incrementando una unidad al contenido de dicho contador cada vez, que se ejecuta una instrucción, de tal manera que siempre contiene la dirección de la instrucción siguiente.
Esto hace que el programador deba almacenar las instrucciones de un programa en direcciones numéricamente adyacentes, colocando en las direcciones más bajas las primeras instrucciones a ejecutar, y en las posiciones más altas, las últimas.
Esta regla de ejecución secuencial se cumple siempre, excepto cuando la instrucción contenida en una posición de memoria es la de salto a cualquier otra posición determinada. Una instrucción de este tipo contiene la dirección de la próxima instrucción a ejecutar, que puede estar almacenada en cualquier posición de la memoria, siempre y cuando no sobrepase los límites de la misma.
Cuando tiene lugar una operación de salto, el Procesador Central sustituye el contenido de su contador de su programa por la dirección especificada en la instrucción, por lo que la ejecución continúa en esta dirección.
Existe, no obstante, un tipo especia! de salto, que es la LLAMADA a una subrutina.
En este caso el procesador necesita, por las razones que más tarde se expondrán, "recordar" el contenido del contador de programa en el momento inmediatamente anterior a cuando tiene lugar el salto.
Una SUBRUTINA es un programa dentro de un programa. Generalmente consiste en un grupo de instrucciones que realizan una operación determinada que se repite varias veces a lo largo del programa total. Por ejemplo, unas aplicaciones típicas de subrutinas pueden ser las de calcular el cuadrado, el seno o el logaritmo de una constante, o extraer o introducir datos en algún periférico.
Para asegurar que una vez ejecutada la subrutina, la ejecución del programa retorna al lugar adecuado en el programa principal, cuando el procesador reconoce una instrucción de llamada, incrementa al contador de programa y almacena su contenido en un área de memoria reservada, denominada STACK.
El stack contiene, por tanto, la dirección de la instrucción siguiente a la que realiza la llamada. Es entonces cuando se carga en el contador de programa la dirección especificada por la instrucción de llamada, que será la primera a ejecutar por la subrutina.
La última instrucción de una subrutina es una de RETORNO. Esta instrucción no especifica ninguna dirección, puesto que cuando una instrucción de este tipo es reconocida por el Procesador, simplemente sustituye el contenido actual del Contador de Programa por la dirección colocada en la parte superior del 'stack', lo cual origina que la ejecución del programa se realice correctamente a partir de la instrucción siguiente a la de llamada.
En muchas ocasiones las subrutinas se encadenan. Es decir, una primera subrutina puede llamar a una segunda, ésta a una tercera y así sucesivamente. Esto es totalmente correcto, siempre y cuando se disponga de la capacidad de almacenamiento suficiente para guardar todas las direcciones sucesivas de retorno, es decir, el nivel máximo de llamada a subrutina viene determinado por el propio tamaño del stack. Si éste tiene capacidad para almacenar tres direcciones de retorno, únicamente pueden ejecutarse tres niveles de llamada a subrutina, pues si pasamos de este límite se perderían algunas direcciones de retorno y la ejecución del programa no se realizaría correctamente.
Según el tipo de Procesador, existen varias formas de confeccionar los stacks. Algunos tienen la posibilidad de guardar las direcciones de retorno en el propio procesador. Otros, en cambio, utilizan una determinada zona de la memoria externa como stack, disponiendo de un registro de PUNTERO en el cual está contenida la dirección que ha entrado en último lugar en el stack, que es la primera dirección de retorno que tendrá lugar. La ventaja de utilizar un stack externo estriba en que prácticamente permite una concatenación ilimitada de subrutinas. Por otra parte, si el procesador dispone de instrucciones que permitan colocar o sacar del stack el contenido del acumulador o de cualquier otro registro a través de la dirección almacenada en el puntero de stack, es posible realizar interrupciones de varios niveles. De esta forma el estado actual del procesador (por ejemplo, el contenido de todos sus registros) puede preservarse en el stack cuando se acepta una interrupción, y restaurarse una vez que la misma ha sido procesada. Esta facultad de conservar los estados del procesador es asimismo factible si la rutina servicio de una interrupción es a su vez interrumpida.
Escrito por Archie Tecnology
Si te ha gustado esta entrada y te ha sido de utilidad, por favor, ayuda a otros a encontrarnos con un Me Gusta en Facebook, o , un Twitter. Además para que puedas estar informado puntualmente de nuestras novedades puedes hacerte seguidor de este blog y seguirnos en nuestras redes sociales. Muchas gracias por su confianza, que es por lo que trabajamos y hace superarnos día a día.
ARTÍCULOS RELACIONADOS
No hay comentarios:
Publicar un comentario