Construye tu computadora Mínimum.

Parte 2: Diagrama esquemático.

Por: Oscar Toledo Esteva.       Septiembre de 2018.


Reinicio del microprocesador

Al operar una computadora hay que reiniciar su microprocesador, todas cuentan con un activador automático de RESET (Reinicio) y el usuario ignora que un circuito de tiempo activó su microprocesador para comenzar a procesar el programa del sistema operativo. Mínimum cuenta con un boton RESET para que el programador en una mala programación o corrección pueda reiniciar de inmediato el microprocesador, un oscilador interno del microprocesador inicia por omisión a una frecuencia base de 16 megaherzios (MHZ) y en pasos prefijados divide la frecuencia para cada periférico interno. Con un programa se sintetiza la frecuencia base (16 MHZ) para elevarla hasta 168,000,000 herzios, para esto se utilizan varios registros, derivado del registro de control del oscilador y RESET RCC_CR (RESET AND CLOCK CONTROL), la frecuencia generada es posible dividirla para la cadencia de trabajo de las puertas de entradas o salidas, y los demás periféricos que determine el programador.

Programa con lenguaje ensamblador

Un modo de implementar programas en un microprocesador es con un lenguaje ensamblador, que resulta ventajoso por su ejecución directa y rápida. Otra alternativa es trabajar con el lenguaje C o C++, por su escritura y mantenimiento fácil, es sencillo de implementar en otros microprocesadores, pero los compiladores para lenguajes como el C no son amistosos, su compilador puede trasladar el lenguaje escrito a microclaves poco óptimas, con errores de redondeo en cifras con coma flotante o generan programas que ocupan mas espacio de memoria, además aleja al usuario del lenguaje original del microprocesador, similar a un compilador-traductor del diidxazá al inglés con escaso o con redundancia de palabras. Solo el lenguaje ensamblador puede optimizar las instrucciones del microprocesador aunque puede ser un trabajo perseverante y laborioso que extiende el tiempo para concluir el desarrollo.

La mayoría de los programas para los sistemas computarizados se escriben con C, y su compilador traslada la edición del programador a código binario del microprocesador, las literaturas de los fabricantes de chips ponen como ejemplo la programación C para sus productos, y el lenguaje ensamblador que maneja directamente las instrucciones del microprocesador queda relegado, este lenguaje tiene un editor de testo para la sintaxis de las etiquetas de inicio, bifurcación y las tablas de parámetros del programa, principalmente los códigos nemónicos con sus valores y una franja para comentarios, para ilustrar las cifras de las direcciones con el código de las instrucciones, se utiliza un ordenador del ensamblador.

El lenguaje ensamblador no es fácil de manipular, pero maneja rápido y directo los códigos del microprocesador, el lenguaje C usa librerías predefinidas para cada microprocesador, que excluye instrucciones especializadas, puertas de entradas y salidas, interrupciones de multitareas o la cadencia de tiempo para un sistema operativo. Aunque manejar directamente los códigos del microprocesador es arduo, suele ser efectivo, mas cuando la velocidad del programa es crítica. Al ejecutar el programa escrito, toda la sintaxis pasa por un filtro del lenguaje para extraer solo las cifras binarias del conjunto de instrucciones que se almacena en la dirección de la memoria de tareas, listo para ser ejecutado por el microprocesador.

Al memorizar gradualmente los nemónicos de las instrucciones el iniciado en lenguaje ensamblador descubre que hay diferentes formas de aplicarlos en los algoritmos clásicos. A la luz de la necesidad de encontrar una mejor solución al procesamiento digital, si realmente se busca rapidez u optimizar un programa, hay que descender hasta el nivel del lenguaje máquina del procesador con el lenguaje ensamblador.

Instrucciones del microprocesador


Cada instrucción del microprocesador ocupa un lapso de tiempo en su ejecución, la mayoría se ejecutan en un ciclo de reloj, solo algunas especializadas toman mas tiempo en su ejecución, como la instrucción VDIV.F32 S0,S0,S1 que se ejecuta en 14 ciclos del reloj del microprocesador. Con la frecuencia del reloj con 16000000 de hertzios comienza el proceso y la búsqueda de instrucciones, con esta frecuencia se obtiene un periodo de 62.5 nanosegundos por cada ciclo de trabajo, la instrucción SUBS R1,#1 equivale a una resta del valor que contiene R1, esta instrucción toma un ciclo de reloj para ser ejecutada, en cambio la instrucción BNE ocupa 3 ciclos en su ejecución, por ejemplo:


        MOVS R1,#01             ; R1 = 1
        LSLS R1,R1,#13          ; Valor desplazado 19 veces a la izquierda
                                ; y R1 = 80000 = 524288 decimal
 salto  SUBS R1,#1              ; Se ejecuta en 1 ciclo
        BNE salto               ; Se ejecuta en 3 ciclos

Retardo del registro R1, y consume 4 ciclos para su ejecución.(4 ciclos x 524288) x .0000000625 nanosegundos = 131 milisegundos.

        MOV.W R1,#FFFFFFFF      ; R1 = 4294967295 (valor decimal)
 salto  SUBS R1,#1              ; Se ejecuta en 1 ciclo
        BNE salto               ; Se ejecuta en 3 ciclos

El mismo programa con 32 bits para obtener un máximo retardo con el registro R1, y consume 4 ciclos para su ejecución. R1 = FFFFFFFF = 4294967295. (4 ciclos x 4294967295) x .0000000625 nanosegundos = 17.8 minutos.

Los microprocesadores usan varios registros para guardar parámetros, traspasar datos a otros registros o almacenarlos en la memoria, cada registro es como una celda de memoria temporal que guarda un código con un valor binario, desde cero hasta un valor de 32 bits. El microprocesador de Mínimum usa en sus instrucciones la arquitectura de cargar y almacenar (Load and Store) en sus registros, al construir programas con el repertorio de instrucciones es conveniente tener el organigrama de la tarea con los datos, que posteriormente se almacena en la memoria, en el proceso mueve el valor binario con el primer operando del registro. El valor para la instrucción MOVS cubre el rango de un grupo de 8 bits = 1 byte para cubrir la cuarta parte de 32 bits, Por ejemplo: MOVS R1,#04 coloca el valor 4 al registro R1. Por lo tanto 0 4 = 0000 0100 binario, equivale a dos valores hexadecimales como lo indica la tabla de conversión numérica. Se utilizan 16 registros de 32 bits cada uno, donde los registros 0 y 7 son los registros bajos que usan la instrucción MOVS Rd,n, R8 hasta R12 son los registros superiores para uso general, mientras que R13 hasta R15 son registros especiales del microprocesador.

El registro 13 (R13) es para uso exclusivo del Stack Pointer (SP) que guarda la dirección de la pila de memoria, R13 comparte dos funciones indicadoras; la pila principal (Main Stack MSP) y la pila de procesos complejos (Process Stack PSP). En el arranque inicial, el microprocesador utiliza la pila MSP, el programador siempre fija la dirección de SP en la parte superior de la memoria disponible para los programas. R13 apila datos de 32 bits de la parte superior a la inferior de la memoria de trabajo, para salvar el contenido de un registro este se guarda en la pila de memoria que maneja SP, y en automático se pueden almacenar los retornos de subprogramas o subrutinas con la instrucción apropiada, igual que una cadena de datos de los registros, cada locación de memoria ocupada desciende 32 bits el indicador del registro SP. Al meter y sacar datos de los registros se utilizan las instrucciones PUSH y POP, otras instrucciones pueden guardar y obtener el contenido de multiples registros de la pila de memoria. R14 es el Registro de Enlace (LR), guarda la dirección de retorno de la memoria para ser ejecutado al regreso de una subrutina o subprograma. R15 es el Program Counter (PC), que guarda y apunta la dirección de la memoria de la próxima instrucción ejecutable.

Los principales grupos de instrucciones son para:


Instrucciones para guardar o leer en registros de uso general y registros especiales.

Inicialmente las instrucciones usan los registros para fijar sus parametros, para el proceso y el resultado del programa. Las instrucciones tienen un formato que el ensamblador usa para presentar los nemónicos.

Guarda o mueve un dato en registro:

MOVW R0,#1234   ; R0 es el registro destinario

Guarda o mueve un dato entre registros:

MOVS R0,R1      ; R1 es el registro fuente que no pierde el
                ; dato y R0 es el registro destinario.



Ejemplos con instrucciones para programación aritméticas y lógicas.

Hay dos pseudoinstrucciones que proporciona el programa ensamblador Familia Toledo, y sirven para guardar datos de 32 bits en registros:


LDR R0,=76543210        ; Este valor se obtiene de una locación
                        ; prefijada de la memoria
ADR R1,=2000:2000       ; Este dato indica la locación directa
                        ; de una memoria del sistema

Registros y locaciones de memoria

Al programar Mínimum solo se utiliza el repertorio de instrucciones del microprocesador, cada instrucción binaria de 16 o 32 bits es un código exclusivo para ser leído, codificado y ejecutado por el microprocesador, el conjunto de códigos o claves forman el programa o software de la computadora. Al desarrollar un programa se busca un procedimiento directo o algoritmo, que conduzca a la solución de un problema, este método no es nada nuevo, hace más de 2000 años Euclides observó paso a paso como solucionar problemas con matemáticas, ya en el siglo IX, del nombre del matemático persa Al-Khwarizmi derivó la palabra algoritmo, que suele ser un método definido para desarrollar programas de computadoras, desde un programa que suma dos números enteros hasta rutinas complejas con coma flotante. Un algoritmo se representa mediante un diagrama de flujo u organigrama, para bosquejos complicados y visualizarlos, el algoritmo se puede expresar en una secuencia de instrucciones llamado código, al escribir el programa se utiliza un lenguaje estructurado de alto nivel -hay docenas de lenguajes de programación- que traduce literalmente del lenguaje cercano al programador las cifras binarias de las claves o códigos que utilizan las instrucciones del microprocesador.



Ejemplos para guardar y leer registros desde la memoria.

Registro de estatus del programa

El microprocesador utiliza un registro de 32 bits especializado (PSR. Program Status Register) como estado de operación de los condicionamientos para bifurcar a otra locación de memoria, para guardar u obtener un dato de forma automática. Para esto, PSR activa unos bits binarios localizados en los bits 31, 30, 29, 28 y 27, como banderas condicionantes: El bit 31 ocupa la bandera N (Negative), subsecuentemente Z (Zero), C (Carry), V (Overflow) y Q (Saturation).


La bandera N es 1 si el resultado es un número negativo, y cero si es un número positivo.
La bandera Z es 1 si el resultado de una cifra es 0, de lo contrario Z = 0.
La bandera C es 1 si ocurre un acarreo en un resultado aritmético, de lo contrario C = 0.
La bandera V es 1 si ocurre un desborde aritmético en la frontera del bit 31, de lo contrario V = 0.
La bandera Q = 1 indica saturación con las instrucciones SSAT o USAT, también indica un desbordamiento de una cifra con DSP.

El registro XPSR tiene una franja de bits para examinar las banderas. Bit 31 = N, bit 30 = Z, bit 29 = C, bit 28 = V y bit 27 = Q. Bit 19:16 son banderas de GE (Greater-Equal) que indican: igual o mayor que, para instrucciones DSP (Digital Signal Processing), bit 8:0 indica con número hexadecimal mas de 256 errores de programación, que pueden ocurrir al realizar programas con interruptor. Es necesario un programa externo especial llamado depurador que ayuda al programador para ver donde y por qué ocurre un error.



Registros especiales

Para accesar a los registros especiales se utilizan las instrucciones MRS y MSR:

MRS Rg,Re       ; Mueve el dato de un registro especial a un registro
                , de uso general

MSR Re,Rg       ; Mueve el dato de un registro de uso general a un
                ; registro especial

Por ejemplo:

MRS R0,XPSR ; Lectura en R0 del registro especial del estatus del microprocesador

MSR CONTROL, R0 ; Escribe el valor de R0 al registro control

Ejemplo con el registro de estatus del programa

El resultado de una operación con instrucciones de aritmética, lógicas, comparaciones de datos, desplazamiento y rotaciones de bits, activan las banderas de XPSR que deciden la dirección de las bifurcaciones de los saltos condicionantes.

Instrucción para activar dos banderas

CMP.W R0,#80000000 ; El valor de R0 se compara con 8000:0000.
                   ; El resultado es V=1 que indica un desbordamiento
                   ; de la cifra de 32 bits, siendo un número negativo N=1

El siguiente programa es el algoritmo de Euclides para determinar el máximo divisor común (MDC) implementado con las instrucciones de Mínimum, se utilizan dos enteros positivos: El MDC de (A 152) y (B 57) = 19.

Comprobación de A y B después de un número finito de pasos.

A 152 57 MOD = 38    Primer ciclo
B 57  38 MOD = 19    Segundo ciclo
R 38  19 MOD = 0     Tercer ciclo, si final es = 0 el resultado de MDC es 19

Programa eficiente del máximo divisor común de Euclides en Mínimum, se usaron cifras con 8 bits para los enteros positivos que están escritos con notación hexadecimal.

        MOVS R0,#98     ; A = 152 decimal
        MOVS R1,#39     ; B = 57 decimal
      X CMP R0,R1       ; Compara el valor de A y B
        ITE GT          ; GT (Great Then) condiciona N Z C V
        SUBGT R0,R0,R1  ; Si A es mayor que B: A = A - B
        SUBLT R1,R1,R0  ; Si B es mayor que A: B = B - A
        BNE X           ; Si A = B, finaliza

        STR R0,[R2]     ; El resultado se guarda en la dirección
                        ; indicada por R2

        Resultados en el registro 0 = 13 = 19 decimal
                         registro 1 = 0
                         registro de estatus XPSR N=0 No hubo número negativo
                                                  Z=1 Hubo cero
                                                  C=1 Hubo acarreo
                                                  V=0 No hubo desbordamiento

 

Artículo anterior Artículo anterior Siguiente artículo Siguiente articulo