DESCRIPCIÓN

La Máquina Rudimentaria (MR) es un procesador pedagógico. Su principal objetivo es servir como herramienta para enseñar los conceptos básicos sobre estructura y arquitectura de computadores. El diseño lógico de la MR se ha realizado utilizando conocimientos básicos sobre sistemas digitales, por lo cual puede utilizarse como ejemplo de un sistema complejo en un curso de lógica digital, permitiendo realizar una transición natural entre el estudio de los circuitos digitales y el del lenguaje máquina. La MR ha sido diseñada en el Departament d' Arquitectura de Computadores (DAC) de la Universitat Politècnica de Catalunya (UPC, Barcelona, España). La MR se encuentra descrita en "Fundamentos de Computadores", R.Hermida, A.M. del Corral, E.Pastor y F.Sánchez, Editorial Síntesis, Madrid 1998. ISBN 84-7738-574-2



Descripción de la Arquitectura de la Máquina Rudimentaria

 

Arquitectura de la Máquina Rudimentaria: Nivel de Lenguaje Máquina

 

Introducción

La MR es un procesador RISC de propósito general. Tiene un banco de registros de 8 registros de 16 bits, numerados desde R0 a R7. El R0 es un registro especial que no se puede escribir y que siempre contiene el valor 0. Dispone de tres indicadores de condición: V (overflow), Z (cero) y N (negativo) que las instrucciones de salto usan para decidir si el salto se produce o no.

La memoria está compuesta por 256 palabras de 16 bits, y es direccionable a nivel de palabra. Los operandos de la MR son números enteros codificados en complemento a dos con 16 bits.

Las instrucciones de la MR son de longitud fija de 16 bits. El código de operación se encuentra en los dos bits de mayor peso. Existen tres tipos de instrucciones:

Las instrucciones usan cuatro modos de direccionamiento:

El repertorio de instrucciones de la MR se describe a continuación.

 

Instrucciones aritmético-lógicas

Las instrucciones aritmético-lógicas usan el modo registro y el modo inmediato.

Todas las instrucciones aritmético-lógicas escriben su resultado en un registro (Rd) y activan convenientemente los indicadores de condición V, N y Z. Si el registro indicado es el R0 no se escribe el resultado, y solamente se activan los indicadores V, N y Z.

Se distinguen dos tipos de instrucciones aritmético-lógicas, en función de donde están sus operandos fuente: las que leen los operandos de registros y las que tienen un operando en un registro y el otro operando es inmediato. La MR dispone de seis instrucciones aritmético-lógicas:

Todas las instrucciones aritmético-lógicas usan el mismo código de operación (11). A continuación se codifican en binario los registros destino, fuente 1 y fuente 2. En las instrucciones registro registro no se usan los dos bits que vienen a continuación. En las instrucciones con un operando inmediato se codifica este operando usando los tres bits de Rf2 y los dos bits no usados. En el caso particular de la instrucción ASR, de sólo un operando, éste secodifica en el campo Rf2. Los tres bits más bajos de la instrucción constituyen el campo denominado OP, y codifican el tipo de operación a realizar con los datos. El campo OP (bits 2-0) permite identificar a cada instrucción según la siguiente tabla:

Como puede observarse en la tabla anterior, el bit OP2 distingue los dos tipos de instrucciones aritmético-lógicas: registro-registro (OP2=1) y registro-inmediato (OP2=0).

 

Instrucciones de acceso a memoria

Las instrucciones de acceso a memoria usan el modo registro y el modo desplazamiento. La dirección de memoria a la que acceden se calcula sumando los 8 bits de menor peso de un registro del banco de registros, denominado registro índice (Ri), con una dirección codificada en la propia instrucción (dirección base).

Existen dos instrucciones de acceso a memoria

El campo CO (código de operación) ocupa los dos bits de mayor peso. A continuación se codifica el registro destino (LOAD) o el registro fuente (STORE). Después se codifican los tres bits del registro índice y, finalmente, en los 8 bits de menor peso se codifica la dirección base.

 

Instrucciones de salto

Las instrucciones de salto usan el modo absoluto para indicar la dirección de salto. Se requieren 8 bits para identificar una dirección absoluta. Ninguna instrucción de salto altera el valor de los indicadores de condición. Existen seis instrucciones de salto condicional y una de salto incondicional:

Todas las instrucciones de salto usan el código de operación (10) codificado en los bits de mayor peso. El campo COND (bits 13-11), codificado a continuación, permite identificar a cada instrucción según la siguiente tabla:

A continuación del campo COND se codifican tres bits a 0. Finalmente, los 8 bits más bajos de la instrucción contienen la dirección de salto.

 

Arquitectura de la Máquina Rudimentaria: Nivel de Lenguaje Ensamblador

El lenguaje ensamblador (LE) se introduce para simplificar la programación en lenguaje máquina. El LE de la MR está constituido por instrucciones, etiquetas, directivas, expresiones y macros.

 

Instrucciones

El LE codifica, mediante la utilización de un código mnemotécnico, cada una de las distintas instrucciones del lenguaje máquina y la forma de acceder a los operandos.

Instrucciones aritmético-lógicas

Instrucciones de acceso a memoria

Instrucciones de salto

Descripción de los mnemotécnicos y de la especificación de los operandos.

 

 Etiquetas

Las etiquetas son un mecanismo para establecer referencias a instrucciones y datos sin necesidad de conocer su dirección exacta en memoria. Una etiqueta se define al principio de una línea mediante un identificador seguido por el símbolo ":". Los símbolos definidos como etiquetas pueden ser utilizados para especificar direcciones en instrucciones de acceso a memoria o de salto. El proceso de ensamblaje encargado de la traducción a lenguaje máquina calcula la dirección de memoria exacta correspondiente a cada etiqueta, y la almacena en una tabla de símbolos que es utilizada para la traducción de cada instrucción.

 

Directivas

Las directivas son indicaciones que se introducen en un programa para controlar el proceso de ensamblaje. Suelen empezar con un punto. Existen dos tipos básicos de directivas en el LE de la MR:

Cualquier programa en lenguaje ensamblador debe tener una directiva .begin y al menos una directiva .end.

 

Expresiones aritméticas

El lenguaje ensamblador permite el uso de expresiones aritméticas en lugar de valores numéricos. Las expresiones aritméticas son evaluadas durante el proceso de ensamblaje. Una expresión es:

Para realizar la evaluación de las expresiones se utiliza el orden de precedencia clásico de los operadores. No se permiten paréntesis.

 

Macros

Una macro o pseudoinstrucción es un módulo de instrucciones parametrizable que puede ser referenciado desde cualquier punto del programa. Para definir una macro se dispone de dos directivas especiales, entre las cuales debe escribirse el código (cuerpo) de la macro:

.def nombre {lista de argumentos}

cuerpo de la macro

.enddef

La directiva .def señala el principio de la definición de la macro y le da nombre. La directiva .enddef indica el final de la macro. Los argumentos pueden ser de tres tipos, y van precedidos de los símbolos $d, $i o $, según el espacio de direcciones en el que está almacenado el dato al que hacen referencia:

 

Arquitectura de la Máquina Rudimentaria: Nivel de Implementación

La Máquina Rudimentaria (MR) posee una arquitectura de tipo Von Neumann. Por tanto, la MR ejecuta programas guardados en la memoria que también contiene los datos requeridos por los programas. La forma normal de introducir datos y programas en la memoria en un computador von Neumann es haciendo uso de la unidad de Entrada/Salida (E/S). Dado que la MR no dispone de esta unidad, se asumirá que los datos y las instrucciones se encuentran en una dirección de memoria determinada, sin preocuparse de como han sido almacenados en ella.

Describiremos a continuación las características generales de cada una de las unidades de la MR, según el modelo de arquitectura von Neumann:

 

La Memoria

La memoria de la MR está organizada en 256 posiciones de 16 bits cada una. Esta memoria recibe los datos a través del bus de entrada Min y los envía al procesador a través del bus Mout. Ambos buses son de 16 bits. Para acceder a una posición de memoria es preciso poner su dirección en el bus de direcciones M@. Este bus es de 8 bits. La señal L’/E indica a la memoria si debe escribir en (1) o leer de (0) la dirección presente en el bus de direcciones.

La MR trabaja con datos numéricos enteros de 16 bits, codificados en complemento a 2. Las instrucciones de la MR se codifican en 16 bits, de modo que cada posición de memoria puede contener indistintamente una instrucción o un dato.

 

La Unidad Central de Proceso

La Unidad Central de Proceso (CPU) de la MR esta constituida por dos elementos:

 

Unidad de Proceso (UP)

La UP es capaz de ejecutar las instrucciones descritas en el nivel de lenguaje máquina. Ha sido diseñada con el doble objetivo de ser eficiente y de fácil comprensión.

La UP tiene los siguientes elementos, gestionados por la UC:

En la UP se distinguen dos circuitos sencillos que realizan funciones específicas y tres grandes bloques:

El operando A de la UAL siempre proviene del banco de registros. El multiplexor SELDAT permite seleccionar el operando B entre el banco de registros y el operando inmediato para las instrucciones aritméticas, o de la memoria para las instrucciones Load.

Unidad de control (UC)

El funcionamiento de la UP esta gobernado por la UC. La UC es un sistema secuencial que determina el orden en que deben actuar los distintos elementos en la UP para completar la ejecución de cada una de las instrucciones. La UC gestiona la carga de los distintos registros (Ld_RA, Ld_IR, Ld_PC, Ld_R@, Ld_RV, Ld_RZ y Ld_RN) y del banco de registros (ERd), la memoria (L’/E) la UAL (OPERAR) y los distintos multiplexores (PC’/@ y CRf). El control de estos bloques se realiza según el código de operación de la instrucción en ejecución (CO) y la evaluación de la condición de salto (Cond).

La UC se comunica con la Unidad de Proceso mediante un conjunto de señales de control. Su función principal es controlar el secuenciamiento de las operaciones realizadas en la Unidad de Proceso para que las instrucciones del programa se ejecuten correctamente. Este circuito recibe como entradas 3 bits de la Unidad de Proceso y envía 12 bits de salida para controlar los módulos que la forman (registros, ALU, multiplexores, etc.).

La UC se especifica como una máquina de estados finita usando el modelo de Moore. En este modelo, las salidas están asociadas a los estados y las transiciones entre estados dependen de las entradas del sistema. Las operaciones a realizar en cada estado se especifican en una tabla de salidas.

 

Los Buses

Los buses de la MR establecen la comunicación entre la CPU y memoria. En la MR, los buses tienen las siguientes características.

 

¿Cómo es un programa escrito en lenguaje ensamblador de la MR?

.DEF <nombre macro> <lista parámetros>

<lista instrucciones de la macro, usando si es necesario los parámetros>

.ENDDEF

 

CAMBIOS DE LA MR CON RESPECTO A VERSIONES ANTERIORES

En la máquina se ha incluido un nuevo flag: el bit de overflow V almacenado en el registro RV. Este bit se pone a 1 cuando el resultado de la última operación aritmética realizada produce desbordamiento, considerando los datos como enteros de 16 bits representados en complemento a dos. La inclusión de este bit ha sido necesaria para garantizar que los programas se ejecutan correctamente. En versiones anteriores las instrucciones de salto BG, BGE, BL y BLE podían provocar saltos erróneos si en la operación anterior se había producido desbordamiento. Teniendo en cuenta la simplicidad de la MR, hemos preferido añadir este bit y modificar las instrucciones de salto antes mencionadas para que salten teniéndolo en cuenta, de forma que ninguno de los programas que puedan llegar a ejecutarse lo haga de forma errónea. Las instrucciones de salto antes mencionadas funcionan de la siguiente forma: