Arquitectura-de-Computadoras

💻Ejercicios Random

1) Escribir un programa para Winmips que lea un arreglo (tabla) de N datos en punto flotante almacenados en la memoria, y genere un segundo arreglo (tabla2) cuyos N-1 elementos sean el promedio de cada par de datos consecutivos del arreglo original. Es decir, el primer elemento de tabla2 debera ser el promedio entre los elementos 1 y 2 de tabla1, el segundo elemento de tabla2 deberpa ser el promedio entre los elementos 2 y 3 de tabla1, etc. El calculo del promedio se debe realizar en una subrutina. El arreglo tabla2 debe quedar almacenado en memoria a continuación de tabla1. Una vez generado el arreglo tabla2, todos sus elementos deben visualizarse en la pantalla terminal del simulador. Esto debe implementarse a través de otra subrutina que reciba como parámetro la dirección inicial del arreglo. Considerar N = 12 (10 puntos) Resolución

2) Escriba un programa que utilice sucesivamente dos subrutinas: La primera, denominada ingreso, debe solicitar el ingreso por teclado de un número entero (de un dígito), verificando que el valor ingresado realmente sea un dígito. La segunda, denominada muestra, deberá mostrar en la salida estándar del simulador (ventana Terminal) el valor del número ingresado expresado en letras (es decir, si se ingresa un ‘4’, deberá mostrar ‘CUATRO’). Resolución

3) Escriba un programa que realice la suma de dos números enteros (de un dígito cada uno) utilizando dos subrutinas: La denominada ingreso del ejercicio anterior (ingreso por teclado de un dígito numérico) y otra denominada resultado, que muestre en la salida estándar del simulador (ventana Terminal) el resultado numérico de la suma de los dos números ingresados. Resolución

4) Escriba un programa que solicite el ingreso por teclado de una clave (sucesión de cuatro caracteres) utilizando la subrutina char de ingreso de un carácter. Luego, debe comparar la secuencia ingresada con una cadena almacenada en la variable clave. Si las dos cadenas son iguales entre si, la subrutina llamada respuesta mostrará el texto “Bienvenido” en la salida estándar del simulador (ventana Terminal). En cambio, si las cadenas no son iguales, la subrutina deberá mostrar “ERROR” y solicitar nuevamente el ingreso de la clave. Resolución

5) Escribir un programa que multiplique dos numeros enteros almacenados en memoria (sin utilizar la instruccion DMUL), mediante sumas sucesivas y almacene el resultado en memoria. Resolución

6) Escribir un programa que busque un valor existente en la posicion de memoria BUSCAR en una TABLA de cantidad de elementos indicada en la posición de memoria LONG. Si se encuentra el valor en la tabla debe cargarse el valor en R10, caso contrario debe cargarse 0 Resolución

7) Escribir un programa que recorra una TABLA de cantidad de elementos indicada en la posición de memoria LONG y genere otra a partir de las posiciones de memoria IMPARES que contenga todos los elementos impares de TABLA Resolución

8)Escribir un programa que lea 3 números enteros (A,B y C) ingresados por el usuario desde teclado, realice un calculo aritmético y almacene el resultado en la memoria en la variable RESUL. para mostrar el resultado en la pantalla alfanumerica. Resolución

OPCIONES:

a) El calculo aritmetico es (A+B) elevado a la C, en este caso debe hacer 2 subrutinas: una para el ingreso de los números y otra para mostrar el resultado en la pantalla alfanumerica

b) El calculo aritmetico es (A+B) x C, en este caso debe hacer dos subrutinas, una para el ingreso de los numeros y otra para realizar el calculo.

c) El calculo aritmetico es (A-B) / C, en este caso se deben hacer dos subrutinas, una para realizar el calculo y otra para mostrar el resultado en la pantalla

9) Implementar un programa que produzca una salida estableciendo el color de un punto de la pantalla gráfica (en la ventana Terminal del simulador WinMIPS64). Y que las coordenadas y color del punto sean ingresados por teclado Resolución

10) Escriba una subrutina que reciba como parámetros un número positivo M de 64 bits, la dirección del comienzo de una tabla que contenga valores numéricos de 64 bits sin signo y la cantidad de valores almacenados en dicha tabla. La subrutina debe retornar la cantidad de valores mayores que M contenidos en la tabla. Resolución

11) Escriba una subrutina que reciba como parámetros las direcciones del comienzo de dos cadenas terminadas en cero y retorne la posición en la que las dos cadenas difieren. En caso de que las dos cadenas sean idénticas, debe retornar -1. Resolución

12) Escriba la subrutina ES_VOCAL, que determina si un carácter es vocal o no, ya sea mayúscula o minúscula. La rutina debe recibir el carácter y debe retornar el valor 1 si el carácter es una vocal, o 0 en caso contrario. Resolución

13) Usando la subrutina escrita en el ejercicio anterior, escribir la subrutina CONTAR_VOC, que recibe una cadena terminada en cero , y devuelve la cantidad de vocales que tiene esa cadena. Resolución

14) Escribir un programa que solicite el ingreso de una cadena de caracteres por teclado que finalice al leer el caracter 0. Luego, el programa debe imprimir la cadena ingresada al derecho y al revés. Resolución

15) Escribir un programa que lea una tabla de 3x3 con números en punto flotante. La tabla se almacena como un vector de 9 elementos, donde primero se almacena la fila 1 de izquierda a derecha, luego la fila 2 y finalmente la fila 3. Utilizar una subrutina para la lectura.

Luego de la lectura, realizar dos subrutinas que calculen: subrutina 1) La suma de la diagonal de la matriz (también llamada traza de A o Traza(A)) subrutina 2) La suma de los valores absolutos de los elementos de la matriz (también llamada la Norma de la matriz o Norma(A)).

Las subrutinas deben recibir dirección base de la tabla según la convención vista, y devolver en $f1 y $f2, respectivamente, los valores pedidos.

Finalmente, en el programa principal deberá llamar a estar subrutinas y con su resultado calcular e informar el valor de Traza(A)/Norma(A).

Nota: Para calcular el valor absoluto de un número, sugerimos multiplicar el número por -1 si es que es negativo.

Ejemplo: Si la matriz A tiene valores: Resolucion

1 2 -3

3 4 5

-2 -3 -4

Entonces Traza(A) = 1 + 4 - 4 = 1 y Norma(A) = 1 + 2 +3 +3 + 4 + 5 + 2 + 3 + 4 = 27

Ejercicio_1

.data
    CONTROL: .word 0x10000
    DATA:    .word 0x10008
    tabla1:  .double 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0
    tabla2:  .double 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
;___________________________________________________________________
.code
    LD $s0, CONTROL($0)
    LD $s1, DATA($0)
    DADDI $s2, $0, 12       ; CANTIDAD DE ELEMENTOS
    DADDI $s3, $0, tabla1
    DADDI $s4, $0, tabla2
    DADDI $s5, $0, 3        ; IMPRIMIR UN FLOTANTE

    ;ME MUEVO EN LA TABLA
    
    LOOP: L.D F1, 0($s3)    ; ME MUEVO POR TABLA1
          L.D F2, 8($s3) 

          ; MANDO AMBOS NROS A PROMEDIAR
          JAL PROMEDIAR

          ; GUARDO EL RESULTADO DEL PROMEDIO EN TABLA2
          S.D F3, 0 ($s4)       

          ; AVANZO EN LAS TABLAS Y DISMINUYO EL CONTADOR
          DADDI $s2, $s2, -1
          DADDI $s3, $s3, 8
          DADDI $s4, $s4, 8

    BNEZ $s2, LOOP

    DADDI $a0, $0, tabla2  ; MANDO COMO PARAMETRO LA DIRECCION DE TABLA2
    JAL IMPRIMIR

HALT
;___________________________________________________________________
PROMEDIAR: ADD.D F3, F1, F2
    DADDI $t0, $0, 2
    mtc1 $t0, F4
    cvt.d.l F4, F4
    DIV.D F3,F3,F4
JR $ra
;___________________________________________________________________
IMPRIMIR: DADDI $t0, $0, 11  ; CANTIDAD DE ELEMENTOS DE tabla2

    loopImprimir: L.D F1, 0 ($a0)       ; TOMO EL ELEMENTO ACTUAL
        ; MANDO EL DATO A DATA Y EL 3 A CONTROL
        S.D F1, 0 ($s1)
        SD $s5, 0 ($s0)

        ; AVANZO A LA SIGUIENTE POSICION A IMPRIMIR
        DADDI $a0, $a0, 8
        DADDI $t0, $t0, -1
    BNEZ $t0, loopImprimir

JR $ra
;___________________________________________________________________

Ejercicio_2

.data
    CONTROL: .word 0x10000
    DATA:    .word 0x10008
    tabla1:  .double 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0
    tabla2:  .double 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
;___________________________________________________________________
.code
    LD $s0, CONTROL($0)
    LD $s1, DATA($0)

    DADDI $t3, $0, 12       ; CANTIDAD DE ELEMENTOS
    DADDI $t1, $0, tabla1
    DADDI $t2, $0, tabla2

    ;ME MUEVO EN LA TABLA
    
    LOOP: L.D F1, 0($t1)    ; ME MUEVO POR TABLA1
          L.D F2, 8($t1) 

          ; MANDO AMBOS NROS A PROMEDIAR
          JAL PROMEDIAR

          ; GUARDO EL RESULTADO DEL PROMEDIO EN TABLA2
          S.D F3, 0 ($t2)       

          ; AVANZO EN LAS TABLAS Y DISMINUYO EL CONTADOR
          DADDI $t3, $t3, -1
          DADDI $t1, $t1, 8
          DADDI $t2, $t2, 8

    BNEZ $t3, LOOP

    DADDI $a0, $0, tabla2  ; MANDO COMO PARAMETRO LA DIRECCION DE TABLA2
    JAL IMPRIMIR

HALT
;___________________________________________________________________
PROMEDIAR: ADD.D F3, F1, F2
    DADDI $t0, $0, 2
    mtc1 $t0, F4
    cvt.d.l F4, F4
    DIV.D F3,F3,F4
JR $ra
;___________________________________________________________________
IMPRIMIR: DADDI $t0, $0, 11  ; CANTIDAD DE ELEMENTOS DE tabla2

    loopImprimir: L.D F1, 0 ($a0)       ; TOMO EL ELEMENTO ACTUAL
        ; MANDO EL DATO A DATA Y EL 3 A CONTROL
        S.D F1, 0 ($s1)
        DADDI $t1, $0, 3
        SD $t1, 0 ($s0)

        ; AVANZO A LA SIGUIENTE POSICION A IMPRIMIR
        DADDI $a0, $a0, 8
        DADDI $t0, $t0, -1
    BNEZ $t0, loopImprimir

JR $ra
;___________________________________________________________________


Ejercicio_3 ===========

.data ;leer desde teclado
    CONTROL:      .word 0x10000
    DATA:         .word 0x10008
    MENSAJE:      .asciiz "INGRESE UN NRO: "
    MENSAJE2:     .asciiz "EL RESULTADO ES: "
    RES: .word 0
    NRO: .byte 0
.code
    LWU $s0, CONTROL ($0) 	    ; $s0 = CONTROL
    LWU $s1, DATA ($0) 	   	    ; $s1 = DATA
    ;_______________________________    IMPRIME MENSAJE
    daddi $t0, $0, MENSAJE      ; $t0 = dirección del mensaje a mostrar  
    sd $t0, 0($s1) 			    ; DATA recibe el puntero al comienzo del mensaje 

    daddi $t0, $0, 4 			; $t0 = 4 -> función 4: salida de una cadena ASCII 
    sd $t0, 0($s0) 			    ; CONTROL recibe 4 y produce la salida del mensaje 
         
    ;_______________________________
    DADDI $sp, $0, 0x400        ; INICIALIZO EL PUNTERO A TOPE DE PILA
    JAL INGRESO   
    LD $t6, NRO($0)

    ; IMPRIMO EL MENSAJE PARA INGRESAR OTRO NUMERO
    daddi $t0, $0, MENSAJE                 	    ; $t0 = dirección del mensaje a mostrar  
    sd $t0, 0($s1) 			      	            ; DATA recibe el puntero al comienzo del mensaje 

    daddi $t0, $0, 4 			                ; $t0 = 4 -> función 4: salida de una cadena ASCII 
    sd $t0, 0($s0) 	
    
    JAL INGRESO   
    LD $t7, NRO($0)
    DADD $t6, $t6, $t7

    DADD $a0, $0, $t6

    ;DADDI $a0, $0, -1 
    JAL RESULTADO
    HALT

INGRESO: DADDI $t0, $0, 8   ; LEE UN NRO
    SD $t0,0 ($s0)
    LD $t0,0 ($s1)
    SD $t0, NRO($0)

    ; IMPRIME
    SD $t0, 0 ($s1)
    DADDI $t0, $0, 4
    SD $t0, 0 ($s0) 
    ;_______________________________  LEE E IMPRIME EL NRO
    JR $ra

RESULTADO: daddi $t0, $0, MENSAJE2                 	; $t0 = dirección del mensaje a mostrar  
    sd $t0, 0($s1) 			      	                ; DATA recibe el puntero al comienzo del mensaje 

    daddi $t0, $0, 4 			                    ; $t0 = 4 -> función 4: salida de una cadena ASCII 
    sd $t0, 0($s0) 			                        ; CONTROL recibe 4 y produce la salida del mensaje 
    

    ; IMPRIMO EL RESULTADO
    SD $a0, 0 ($s1) 
    daddi $t0, $0, 2  
    SD $t0, 0 ($s0) 
    JR $ra

Ejercicio_4 ===========

.data 
    CONTROL:       .word 0x10000
    DATA:          .word 0x10008
    CLAVE:        .asciiz 'VAMO'
    ERROR:         .asciiz ' ERROR!'
    CORRECTO:      .asciiz ' BIENVENIDO'
    MENSAJE:       .asciiz ' \n INGRESE UNA CLAVE: '
    INGRESADO:      .byte 0,0,0,0
.code
    LWU $s0, CONTROL($0)
    LWU $s1, DATA($0)
    ;______________________________ IMPRIME MENSAJE
    REPETIR: SD $0, INGRESADO($0) 
    daddi $t0, $0, MENSAJE                 	; $t0 = dirección del mensaje a mostrar  
    sd $t0, 0($s1) 			      	    ; DATA recibe el puntero al comienzo del mensaje 

    daddi $t0, $0, 4 			; $t0 = 4 -> función 4: salida de una cadena ASCII 
    sd $t0, 0($s0) 			        ; CONTROL recibe 4 y produce la salida del mensaje 
 
    ;______________________________
    DADDI $sp, $0, 0x400

    DADDI $t5, $0, 4       ; CANTIDAD DE DIGITOS A LEER

    DADDI $t9, $0 , 0       ; Para cargar contra

    LOOP: beqz $t5, FIN     ; LECTURA DE A UN DIGITO :d
        JAL CHAR
        DADDI $t5, $t5 , -1           ; DECREMENTO MI CONTADOR
    J LOOP

    ;______________________________
    FIN: DADDI $t0, $t0, 4       ; contador para el bucle :D

    DADDI $t3, $0, 0             ; inicializo para recorrer ambos caracteres
    DADDI $t7, $0, 0    

    LD $t1, CLAVE($t3)           ; ME MUEVO POR AMBAS CADENAS
    LD $t2, INGRESADO($t3)
    BNE $t1, $t2 , ERRONEO
    DADDI $t0, $t0 , -1
    
    DADDI $t7, $0, 1            ; PARA PASAR LOS PARAMETROS EN CORRECTO
    J CONTINUAR
    
    ERRONEO: DADDI $t7, $0, 0

    CONTINUAR: JAL RESPUESTA
    J REPETIR
    
TERMINO: HALT

CHAR: DADDI $t0, $0, 9 
    SD $t0,0 ($s0)                ; CONTROL = 9
    LBU $t1,0 ($s1)               ; *PRESIONA UNA TECLA*
    SB $t1, INGRESADO($t9)        ; GUARDO LA VARIABLE

    DADDI $s3, $t9, INGRESADO     ; TOMO LA DIR DE INGRESADO

    SD $s3, 0 ($s1)               ; MANDO DIR DE INGRESADO
    DADDI $t0, $0, 4
    SD $t0, 0 ($s0)               ; IMPRIMIR INGRESADO , CONTROL 4
        
    DADDI $t9, $t9 , 1            ;AVANZO LA CLAVE
    JR $ra

RESPUESTA: beqz $t7, INCORRECTO

    DADDI $t0, $0, CORRECTO  
    SD $t0, 0($s1)  
    DADDI $t0, $0, 4             
    SD $t0, 0($s0) 
    J FIN2

    INCORRECTO: DADDI $t0, $0, ERROR  
    SD $t0, 0($s1)
    DADDI $t0, $0, 4             
    SD $t0, 0($s0) 

    FIN2: JR $ra

Ejercicio_5

.data
    CONTROL: .word 0x10000
    DATA:    .word 0x10008

    NUMERO1: .word -50
    NUMERO2: .word -2
    RES: .word 0
    MASC: .word 0xffffffffffffffff
.code
    LD $s0, CONTROL ($0)
    LD $s1, DATA ($0)
    DADDI $s2, $0, 2

    LD $t1, NUMERO1 ($0)     
    LD $t2, NUMERO2 ($0)

    ;-----------------------------
    slti $t0, $t1, 0
    beqz $t0, JUMP
    daddi $t4, $0, 1
    dadd $a0, $t1, $0
    jal CA2
    dadd $t1, $v0, $0
    ;-----------------------------

    JUMP: DADD $t3, $t3, $t2 
        DADDI $t1, $t1 , -1
    BNEZ $t1, JUMP

    ;-----------------------------
    beqz $t4, FIN
    dadd $a0, $t3, $0
    jal CA2
    dadd $t3, $v0, $0
    ;-----------------------------

    FIN: SD $t3, RES($0)
    SD $t3, 0 ($s1)
    SD $s2, 0 ($s0)
HALT

CA2:        ld $t0, MASC($0)  ;  MASC: .word 0xffffffffffffffff
            xor $v0, $a0, $t0
            daddi $v0, $v0, 1
            jr $ra

Ejercicio_6 ===========

.data
    TABLA:    .word 1,2,3,4,5,6,7
    BUSCAR:   .word 5
    LONG:     .word 7
.code
    LD $t1, LONG($0)
    DADDI $t2,$0, TABLA
    LD $t3, BUSCAR($0)

    LOOP: LD $t0, 0($t2)
        BEQ $t0, $t3, IGUAL
        DADDI $t2, $t2, 8
        DADDI $t1, $t1, -1
        
        BNEZ $t1, LOOP
        DADDI R10,$0,0
    J FIN

    IGUAL: DADD R10,$0,$t3  # Mando el dato a R10
    
FIN: HALT

Ejercicio_7 ===========

                .data
TABLA:          .word 7, 8, 9, 99, 10
LONG:           .word 5
IMPARES:        .word 0

                .text
                daddi $s0, $0, TABLA
                ld $s1, LONG($0)
                daddi $s2, $0, IMPARES
                
                
LOOP:           beqz $s1, FIN           ; Recorro toda la tabla
                ld $t1, 0($s0)          ; copio en t1 el valor de tabla          
                daddi $s0, $s0, 8       ; aumento en la tabla
                daddi $s1, $s1, -1      ; decremento el contador de elementos
                andi $t2, $t1, 1        ; con el and 1 miramos que sea impar
                beqz $t2, LOOP          ; si no es impar, continuo en el loop
                sd $t1, 0($s2)          ; guardo el elemento de la tabla en IMPARES 
                daddi $s2, $s2, 8       ; aumento la posicion
                j LOOP
FIN: halt

Ejercicio_8 ===========

.data
    CONTROL: .word 0x10000
    DATA:    .word 0x10008
    A: .word 0
    B: .word 0
    C: .word 0
    RESUL: .word 0
    MENSAJE:      .asciiz " INGRESE UN NUMERO: "

.code
    LD $s0, CONTROL ($0)    
    LD $s1, DATA ($0)
    
            daddi $t7, $0, 0    ; Recorre la tabla
            daddi $t2, $0, 24
LECTURA:    DADDI $t0, $0, MENSAJE 
            SD $t0, 0($s1)
            DADDI $t0, $0, 4           ; IMPRIMIR              
            SD $t0, 0($s0)

            daddi $t0, $0, 8   ; LEER
            SD $t0, 0 ($s0)             
            
            LD $t1, 0 ($s1) 
            SD $t1, A($t7)

            daddi $t7, $t7, 8       ; Avanzo en los nros ingresados
            bne $t7, $t2, LECTURA


    DADDI $t0, $0, 0
    ld $t1, A($0) 
    ld $t2, B($0) 
    DADD $s2, $t1, $t2      ; A + B
    
 
    ld $t3, C($0)           ; (A + B) ^ C
    DADDI $t0, $t0 ,1
    LOOP: BEQZ $t3, TERMINO
        dmul $t0, $t0, $s2  
        DADDI $t3, $t3, -1        
    J LOOP

    TERMINO: SD $t0, RESUL ($0) 
    SD $t0, 0 ($s1)
    DADDI $t0, $0, 2         
    SD $t0, 0 ($s0)

HALT

Ejercicio_9

.data
    coorX:      .byte 0
    coorY:      .byte 0
    color:      .byte 0, 0, 0, 0; 
    CONTROL:    .word32 0x10000
    DATA:       .word32 0x10008
    MENSAJE1:   .asciiz "INGRESE X: "
    MENSAJE2:   .asciiz "INGRESE Y: "
    MENSAJE3:   .asciiz "INGRESE (R,G,B,TRANSPARENCIA) : "

.code
    LWU $s6, CONTROL($zero)
    LWU $s7, DATA($zero)
    DADDI $s0, $s0, 4           ; PARA IMPRIMIR UN STRING
    DADDI $s1, $s1, 8           ; LEER UN ENTERO DESDE TECLADO
    DADDI $s2, $s2, 7           ; LIMPIAR LA PANTALLA
    DADDI $s3, $s3, 5           ; PINTAR UN PIXEL

    ;__________________________________
    DADDI $t0, $0, MENSAJE1 
    SD $t0, 0 ($s7) 
    SD $s0, 0 ($s6) 

    SB $s1, 0($s6) 
    LBU $t2, 0($s7) 
    SB $t2, coorX($0)
    ;__________________________________    
    DADDI $t0, $0, MENSAJE2 
    SD $t0, 0 ($s7) 
    SD $s0, 0 ($s6) 

    SB $s1, 0($s6) 
    LBU $t3, 0($s7) 
    SB $t3, coorY($0)
    ;__________________________________
    
    DADDI $a0, $0, 4    ;CONTADORES PARA LEER
    DADDI $t0, $0, 0
    LOOP: DADDI $t1, $0, MENSAJE3
        SD $t1, 0 ($s7)
        SD $s0, 0 ($s6)

        SB $s1, 0($s6) 
        LBU $t3, 0($s7) 
        SB $t3, color($t0)
        DADDI $t0, $t0, 1
        DADDI $a0, $a0, -1   ;AVANZO AL SIGUIENTE BYTE
    bnez $a0,LOOP
    ;__________________________________

    SD $s2, 0($s6)      ; LIMPIO LA PANTALLA
    
    LBU $s0, coorX($zero)
    SB $s0, 5($s7)

    LBU $s1, coorY($zero)
    SB $s1, 4($s7)

    LWU $s2, color($zero)
    sw $s2, 0($s7)
    
    SD $s3, 0($s6)       ; IMPRIMIR EL CARACTER
HALT

Ejercicio_10 ============

.data
    M: .word 3
    TABLA: .word 1,2,3,4,5
    RESULTADO: .word 0
.code
    ld $a0, M(r0)           ; a0 = 14
    daddi $a1, $0, 5        ; a1 = cantidad de elementos
    daddi $a2, $0, TABLA    ; a2 = paso la direccion de TABLA
    jal VALORES             ; salto a la rutina y guardo la direccion de retorno
    nop                     ; pinto
    sd $v0, RESULTADO($0)   ; VALORES de retorno de la subrutina, lo guardo en RESULTADO
    halt

VALORES: dadd $t0, $a1, $0              ; guardo 5 en el registro temporal
    dadd $v0, $0, $0                    ; inicializo v0
    LOOP: ld $t4, 0($a2)                ; copia en el registro temporal el primer elemento de la TABLA
        slt $t2, $t4, $a0               ; si t4 es menor que a0, entonces dejo 1 en t2
        bnez $t2 ,NO_INCREMENTAR        ; si t2 <> 0 entonces salto a NO_INCREMENTAR
        beq $t4, $a0, NO_INCREMENTAR    ; Si es igual, no incremento
        daddi $v0, $v0, 1               ; aumento el contador 
    NO_INCREMENTAR: daddi $a2, $a2, 8   ; avanzo en la tabla
        daddi $t0, $t0, -1              ; decremento el contador de elementos de tabla
        bnez $t0, LOOP                  ; si t0 <> 0 salto a loop
        jr $ra                          ; vuelve al programa principal

Ejercicio_11 ============

.data
    CADENA1: .asciiz "hola"
    CADENA2: .asciiz "holaa"
    result:  .word 0
.code
    daddi $a0, $0, CADENA1      ; a0 = CADENA1
    daddi $a1, $0, CADENA2      ; a1 = CADENA2
    jal compara                 ; Llamo a la subrutina
    sd $v0, result($zero)       ; guardo el valor
halt

compara: dadd $v0, $0, $0   ; inicializo V0
    LOOP: lbu $t0, 0($a0)   ; COPIA LA DIRECCION DE CADENA1
        lbu $t1, 0($a1)     ; COPIA LA DIRECCION DE CADENA2
        beqz $t0, FIN_CAD1  ; SI LLEGO AL FINAL DE CADENA1, SALTO
        beqz $t1, FIN       ; SI LLEGO AL FINAL DE CADENA2, SALTO
        bne $t0, $t1, FIN   ; SI EL CARACTER ACTUAL DE CADENA1 <> CARACTER ACTUAL CADENA2, TERMINO
        
        daddi $v0, $v0, 1       ; INCREMENTO
        daddi $a0, $a0, 1       ; INCREMENTO
        daddi $a1, $a1, 1       ; INCREMENTO
    j LOOP

    FIN_CAD1: bnez $t1, FIN     ; SI T1 <> 0, TERMINO
        daddi $v0, $0, -1
    FIN: jr $ra

Ejercicio_12 ============

.data
    LETRA: .ascii '1'
    VOCALES: .asciiz 'AEIOUaeiou'
    RESULTADO: .word 0
.code
    lbu $a0, LETRA($0)          ; paso el CARACTER
    jal ES_VOCAL                ; llamo a la subrutina
    sd $v0, RESULTADO($zero)    ; guardo el resultado
halt

ES_VOCAL:   dadd $v0, $0, $0                ; inicializo v0
            daddi $t0, $0, 0                ; inicializo t0
            LOOP: lbu $t1, VOCALES($t0)     ; copia el  caracter en t1
                beqz $t1, FIN_VOCAL         ; si t1 = 0, no se encontro VOCALES
                beq $a0, $t1, ENCONTRO      ; si LETRA = caracterActual, salto
                daddi $t0, $t0, 1           ; continuo con el siguiente caracter
            j LOOP

            ENCONTRO: daddi $v0, $0, 1      ; si es vocal, retorno 1
            
            FIN_VOCAL: jr $ra               ;vuelvo al programa principal

Ejercicio_13 ============

.data
    CADENA: .asciiz "CazaAAA"
    VOCALES: .asciiz 'AEIOUaeiou'
    CANT: .word 0
.code
    ; La pila comienza en el tope de la memoria de datos
    DADDI $sp, $0, 0x400            ; bus 10 bits 🡪 2^10 = 1024 = 0x400

    ; Guarda como primer argumento para CONT_VOCALES
    ; la dirección de CADENA

    DADDI $a0, $0, CADENA
    dadd $v0, $0, $0  
    JAL CONT_VOCALES
    sd $v0, CANT($0)                  ; Cantidad de caracteres
HALT

CONT_VOCALES: DADDI $sp, $sp, -16     ; Reserva lugar en pila -> 2 x 8
    SD $ra, 0 ($sp)                   ; Guarda en pila $ra
    SD $s0, 8 ($sp)                   ; Guarda en pila $s0

    DADD $s0, $a0, $0                 ; Copia la dirección de inicio de la CADENA
    LOOP: LBU $a0, 0 ($s0)	        ; Toma car. actual
        BEQ $a0, $zero, FIN         ; Si es el fin, termina
        JAL ES_VOCAL
        DADDI $s0, $s0, 1           ; Avanza al siguiente caracter
    J LOOP

    ; Recupera los datos salvados en la pila
    FIN: LD $ra, 0 ($sp)
        LD $s0, 8 ($sp)
        DADDI $sp, $sp, 16
    JR $ra




ES_VOCAL: daddi $t0, $0, 0                    ; inicializo t0
    LOOP2: lbu $t1, VOCALES($t0)     ; copia el  caracter en t1
        beqz $t1, FINVOCAL         ; si t1 = 0, no se encontro VOCALES
        beq $a0, $t1, ENCONTRO      ; si LETRA = caracterActual, salto
        daddi $t0, $t0, 1           ; continuo con el siguiente caracter
    j LOOP2

    ENCONTRO: daddi $v0, $v0, 1      ; si es vocal, aumento 1 el contador
    FINVOCAL: jr $ra               ;vuelvo al programa principal             

Ejercicio_14 ============

                .data
CONTROL:        .word32 0x10000
DATA:           .word32 0x10008
MSJ:            .asciiz "Ingrese un mensaje terminado en 0: \n"
CAR:            .asciiz ""
TXT:            .asciiz ""

                .text
                lwu $s6, CONTROL($0)
                lwu $s7, DATA($0)

                jal cargarMSJ
                DADDI $a0, $v0, 0
                jal imprimirDerecho
                jal imprimirAlrevez
halt

cargarMSJ:      DADDI $t0, $0, MSJ
                sd $t0, 0($s7)
                DADDI $t1, $0, 4
                sd $t1, 0($s6)
                DADDI $t4, $0, 48
                DADDI $t0, $0, TXT
                DADDI $t2, $0, 9

loop:           sd $t2, 0($s6)
                lbu $t3, 0($s7)
                beq $t3, $t4, fin
                sb $t3, 0($t0)
                sd $t0, 0($s7)
                sd $t1, 0($s6)
                DADDI $t0, $t0, 1
                j loop
fin:            DADDI $t1, $0, TXT
                dsub $v0, $t0, $t1
                jr $ra

imprimirDerecho: DADDI $t0, $0, TXT
                sd $t0, 0($s7)
                DADDI $t0, $0, 4
                sd $t0, 0($s6)
                jr $ra

imprimirAlrevez: DADDI $t0, $0, TXT
                dadd $t0, $t0, $a0
                DADDI $t0, $t0, -1
                DADDI $t1, $0, 4
                DADDI $t3, $0, CAR
                sd $t3, 0($s7)
loop2:          lbu $t2, 0($t0)
                sb $t2, 0($t3)
                sd $t1, 0($s6)
                DADDI $t0, $t0, -1
                DADDI $a0, $a0, -1
                bnez $a0, loop2
                jr $ra

Ejercicio_15 ============

.data
    CONTROL: .word32 0x10000
    DATA:    .word32 0x10008
    TABLA:   .word 0,0,0,0,0,0,0,0,0
    preg:    .asciiz ' \n Ingrese un numero '
    resultado:    .asciiz ' \n valor de Traza(A)/Norma(A) es: '
    absoluto: .double  -1.0
    cero: .double 0.0
    
.code
    lwu $s1, CONTROL($zero)
    lwu $s0, DATA($zero)
    l.d f12, cero($zero)

    jal leerDatos

    daddi $a0, $0, TABLA            ; Mando la direccion de la tabla 
    jal trazaA    
    
    daddi $a0, $0, TABLA            ; Mando la direccion de la tabla 
    jal trazaB
    

    daddi $t0, $0, resultado                      ; $t0 = dirección del mensaje a mostrar  
    sd $t0, 0($s0) 			                 ; DATA recibe el puntero al comienzo del mensaje 
    daddi $t0, $0, 4 			            ; $t0 = 4 -> función 4: salida de una cadena ASCII 
    sd $t0, 0($s1) 	

    div.d f3, f1, f2
       
    S.D f3, 0 ($s0)     

    ; Control 3
    DADDI $t0, $0, 3
    SD $t0, 0 ($s1)    
HALT
;__________________________________________________________________________
trazaB: daddi $t7, $0, 0          ; desplazador
daddi $t5, $0, 9                  ; contador

l.d f4, absoluto($0)
add.d f3, f3, f4                  ; constante -1    

loop3: add.d f2, f2 , f0     
    L.D f0, 0 ($a0)            

    daddi $t1, $0, 0
    slti $t1, $t0, 0

    beqz $t1, continuar

    mul.d f0, f0, f3              ; Multiplico con -1.0

    continuar: daddi $a0,$a0,8    ; para tomar los datos de en diagonal
    daddi $t5,$t5,-1              ; disminuyo el contador
    bnez $t5, loop3

    jr $ra
;__________________________________________________________________________
trazaA: daddi $t7, $0, 0          ; desplazador
daddi $t5, $0, 3                  ; contador

loop2: add.d f1, f1 , f0     
    L.D f0, 0 ($a0)            
    daddi $a0,$a0,32              ; para tomar los datos de en diagonal
    daddi $t5,$t5,-1              ; disminuyo el contador
    bnez $t5, loop2
jr $ra
;__________________________________________________________________________
leerDatos: daddi $t5,$0,9          ; Cantidad de elementos

loop: daddi $t0, $0, preg          ; $t0 = dirección del mensaje a mostrar  
sd $t0, 0($s0) 			           ; DATA recibe el puntero al comienzo del mensaje 

daddi $t0, $0, 4 			       ; $t0 = 4 -> función 4: salida de una cadena ASCII 
sd $t0, 0($s1) 			           ; CONTROL recibe 4 y produce la salida del mensaje 

DADDI $t0, $zero, 8
SD $t0, 0 ($s1)             ; CONTROL = 8

L.D f1, 0 ($s0)             ; Tomo número en t0

S.D f1, TABLA ($t6)         ; Guardo el valor en la tabla
daddi $t6,$t6,8             ; Continuo con el siguiente numero
daddi $t5,$t5,-1            ; disminuyo el contador

bnez $t5, loop

jr $ra