Arquitectura-de-Computadoras

💻Parciales

Implementar una subrutina INGRESAR_NUMERO. La misma deberá solicitar el ingreso por teclado de un número entero del 1 al 9. Si el número ingresado es un número válido entre 1 y 9 la subrutina deberá imprimir por pantalla el número ingresado y retornar dicho valor. En caso contrario, la subrutina deberá imprimir por pantalla “Debe ingresar un número” y devolver el valor 0.

Usando la subrutina INGRESAR_NUMERO implementar un programa que invoque a dicha subrutina y genere una tabla llamada NUMEROS con los valores ingresados. La generación de la tabla finaliza cuando la suma de los resultados obtenidos sea mayor o igual a los últimos 3 dígitos de su número mágico.

Al finalizar la generación de la tabla, deberá invocar a la subrutina PROCESAR_NUMEROS.

Se debe usar la convención para nombrar a los registros.

Para todos los casos, la subrutina PROCESAR_NUMEROS debe devolver el valor calculado y desde el programa principal el mismo se debe almacenar en la dirección RESULTADO.

SI SU NUMERO MAGICO TERMINA CON 7, 8 o 9: la subrutina PROCESAR_NUMEROS debe recibir como parámetro la dirección de la tabla NUMEROS y la cantidad de elementos y contar la cantidad de veces que se ingresó el valor 3. Se debe mostrar por pantalla el valor calculado, con el texto ‘Cantidad de Veces que se ingreso el valor 3:’ y el valor.

; NUM MAGICO 3252
.data 
      CONTROL: .word32 0x10000
      DATA: .word32 0x10008
      preg: .asciiz ' \n Ingrese un numero '
      msjerr: .asciiz 'Debe Ingresar un numero \n'
      msj3: .asciiz ' \n Cantidad de Veces que  se ingreso el valor 3: '
      aux: .word 0
      NUMEROS: .word 0
      ;SUMA DE LOS ULTIMOS 3  DIGITOS 9
.code
      lwu $s1, CONTROL($zero)
      lwu $s0, DATA($zero)

      daddi $s7,$0,0          ;Acumulador

      daddi $t6,$0,0          ;Desplazador

      daddi $t5,$0,0          ; Cantidad de elementos

      pedir:  jal INGRESAR_NUMERO
            beqz $v0,pedir
            sd $v0, NUMEROS($t6)
            dadd $s7,$s7,$v0 
            daddi $t6,$t6,8   ;Desplazador
            daddi $t5,$t5,1   ; CAntidad
            slti $s3,$s7,9    ; si el acumulador es menor a 9  $s3 = 1 else $s3= 0
            beqz $s3,seguir
      j pedir 

      seguir: daddi $a0,$0,NUMEROS
      daddi $a1,$t5,0 
      jal PROCESAR_NUMEROS

      daddi $t0, $0, msj3        ; $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 


      sd $v0, 0($s0) 				; DATA recibe el entero
      
      daddi $t0, $0, 1 			; $t0 = 1 -> función 1: salida de un entero sin signo
      sd $t0, 0($s1) 			; CONTROL recibe 1 y produce la salida del numero

halt 


PROCESAR_NUMEROS: daddi $v0,$0,0    ; Contador de 3 
daddi $t7,$0,3 ; Constante 3 
loop: beqz $a1,finalizarRut
      ld $s4, 0($a0)
      daddi $a0,$a0,8
      daddi $a1,$a1,-1
      beq $s4,$t7,sumar 
      j loop 
sumar: daddi $v0,$v0,1
      j loop 
finalizarRut: jr $ra 


INGRESAR_NUMERO: 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, $0, 9                          ; $t0 = 9 -> función 9: entrada de un caracter
sd	$t0, 0($s1)     		            ; CONTROL recibe 9

lbu	$s2, 0($s0)                         ; Leo de DATA el caracter           
sb $s2,aux($0)                            ; Lo guardo

;IF ($t0 > 48 ) and ($t0  < 58 )
slti $t3,$s2,49                           ;  ($t0 < 48) ? $t3 = 1 : $t3 = 0
bnez $t3,error 
slti $t3,$s2,58                           ; ($t0 < 58) ? $t3 = 1 : $t3 = 0
beqz $t3,error
 
daddi $t0, $0, aux 	                  ; $t0 = dirección del mensaje a mostrar  
sd $t0, 0($s0) 			            ; DATA recibe el puntero al comienzo del mensaje 

daddi $t0,$0,4
sd $t0, 0($s1) 			            ; CONTROL recibe 4 y produce la salida del mensaje 


devolver_num: daddi $v0,$s2,-48
j finalrut 
error: daddi $t0, $0, msjerr              ; $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

finalrut: jr $ra

SI SU NUMERO MÁGICO TERMINA CON 0, 1 o 2: la subrutina PROCESAR_NUMEROS debe recibir como parámetro la dirección de la tabla NUMEROS y la cantidad de elementos y contar la cantidad de números impares ingresados. Se debe mostrar por pantalla el valor calculado, con el texto ‘Cantidad de Valores Impares: ‘ y el valor.

; SI SU NUMERO MÁGICO TERMINA CON 0, 1 o 2: la subrutina PROCESAR_NUMEROS debe recibir como parámetro la dirección 
; de la tabla NUMEROS y la cantidad de elementos y contar la cantidad de números impares ingresados.
; Se debe mostrar por pantalla el valor calculado, con el texto 'Cantidad de Valores Impares: ' y el valor.

.data 
      CONTROL: .word32 0x10000
      DATA: .word32 0x10008
      preg: .asciiz ' \n Ingrese un numero '
      msjerr: .asciiz 'Debe Ingresar un numero \n'
      msj3: .asciiz ' \n Cantidad de Valores Impares: '
      aux: .word 0
      NUMEROS: .word 0
      ;SUMA DE LOS ULTIMOS 3  DIGITOS 9
.code
      lwu $s1, CONTROL($zero)
      lwu $s0, DATA($zero)

      daddi $s7,$0,0          ;Acumulador

      daddi $t6,$0,0          ;Desplazador

      daddi $t5,$0,0          ; Cantidad de elementos

      pedir:  jal INGRESAR_NUMERO
            beqz $v0,pedir
            sd $v0, NUMEROS($t6)
            dadd $s7,$s7,$v0 
            daddi $t6,$t6,8   ;Desplazador
            daddi $t5,$t5,1   ; CAntidad
            slti $s3,$s7,9    ; si el acumulador es menor a 9  $s3 = 1 else $s3= 0
            beqz $s3,seguir
      j pedir 

      seguir: daddi $a0,$0,NUMEROS
      daddi $a1,$t5,0 
      jal PROCESAR_NUMEROS

      daddi $t0, $0, msj3        ; $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 


      sd $v0, 0($s0) 				; DATA recibe el entero
      
      daddi $t0, $0, 1 			; $t0 = 1 -> función 1: salida de un entero sin signo
      sd $t0, 0($s1) 			; CONTROL recibe 1 y produce la salida del numero

halt 


PROCESAR_NUMEROS: daddi $v0,$0,0    ; Contador de 3 
 
loop: beqz $a1,finalizarRut
      ld $s4, 0($a0)
      daddi $a0,$a0,8
      daddi $a1,$a1,-1
      andi $t7, $s4, 1        ; con el and 1 miramos que sea impar
      beqz $t7, loop
      
      daddi $v0,$v0,1       ;aumenta 1 en el contador
      j loop 
finalizarRut: jr $ra 


INGRESAR_NUMERO: 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, $0, 9                          ; $t0 = 9 -> función 9: entrada de un caracter
sd	$t0, 0($s1)     		            ; CONTROL recibe 9

lbu	$s2, 0($s0)                         ; Leo de DATA el caracter           
sb $s2,aux($0)                            ; Lo guardo

;IF ($t0 > 48 ) and ($t0  < 58 )
slti $t3,$s2,49                           ;  ($t0 < 48) ? $t3 = 1 : $t3 = 0
bnez $t3,error 
slti $t3,$s2,58                           ; ($t0 < 58) ? $t3 = 1 : $t3 = 0
beqz $t3,error
 
daddi $t0, $0, aux 	                  ; $t0 = dirección del mensaje a mostrar  
sd $t0, 0($s0) 			            ; DATA recibe el puntero al comienzo del mensaje 

daddi $t0,$0,4
sd $t0, 0($s1) 			            ; CONTROL recibe 4 y produce la salida del mensaje 


devolver_num: daddi $v0,$s2,-48
j finalrut 
error: daddi $t0, $0, msjerr              ; $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

finalrut: jr $ra
; SI SU NUMERO MÁGICO TERMINA CON  3 o 4: la subrutina PROCESAR_NUMEROS debe recibir como parámetro 
; la dirección de la tabla NUMEROS y la cantidad de elementos y  contar la cantidad de números pares ingresados.
; Se debe mostrar por pantalla el valor calculado, con el texto 'Cantidad de Valores pares: ' y el valor.

.data 
      CONTROL: .word32 0x10000
      DATA: .word32 0x10008
      preg: .asciiz ' \n Ingrese un numero '
      msjerr: .asciiz 'Debe Ingresar un numero \n'
      msj3: .asciiz ' \n Cantidad de Valores pares: '
      aux: .word 0
      NUMEROS: .word 0
      ;SUMA DE LOS ULTIMOS 3  DIGITOS 9
.code
      lwu $s1, CONTROL($zero)
      lwu $s0, DATA($zero)

      daddi $s7,$0,0          ;Acumulador

      daddi $t6,$0,0          ;Desplazador

      daddi $t5,$0,0          ; Cantidad de elementos

      pedir:  jal INGRESAR_NUMERO
            beqz $v0,pedir
            sd $v0, NUMEROS($t6)
            dadd $s7,$s7,$v0 
            daddi $t6,$t6,8   ;Desplazador
            daddi $t5,$t5,1   ; CAntidad
            slti $s3,$s7,9    ; si el acumulador es menor a 9  $s3 = 1 else $s3= 0
            beqz $s3,seguir
      j pedir 

      seguir: daddi $a0,$0,NUMEROS
      daddi $a1,$t5,0 
      jal PROCESAR_NUMEROS

      daddi $t0, $0, msj3        ; $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 


      sd $v0, 0($s0) 				; DATA recibe el entero
      
      daddi $t0, $0, 1 			; $t0 = 1 -> función 1: salida de un entero sin signo
      sd $t0, 0($s1) 			; CONTROL recibe 1 y produce la salida del numero

halt 


PROCESAR_NUMEROS: daddi $v0,$0,0    ; Contador de 3 
 
loop: beqz $a1,finalizarRut
      ld $s4, 0($a0)
      daddi $a0,$a0,8
      daddi $a1,$a1,-1
      andi $t7, $s4, 1        ; con el and 1 miramos que sea par
      beqz $t7, par
      J loop
      par: daddi $v0,$v0,1       ;aumenta 1 en el contador
      j loop 
finalizarRut: jr $ra 


INGRESAR_NUMERO: 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, $0, 9                          ; $t0 = 9 -> función 9: entrada de un caracter
sd	$t0, 0($s1)     		            ; CONTROL recibe 9

lbu	$s2, 0($s0)                         ; Leo de DATA el caracter           
sb $s2,aux($0)                            ; Lo guardo

;IF ($t0 > 48 ) and ($t0  < 58 )
slti $t3,$s2,49                           ;  ($t0 < 48) ? $t3 = 1 : $t3 = 0
bnez $t3,error 
slti $t3,$s2,58                           ; ($t0 < 58) ? $t3 = 1 : $t3 = 0
beqz $t3,error
 
daddi $t0, $0, aux 	                  ; $t0 = dirección del mensaje a mostrar  
sd $t0, 0($s0) 			            ; DATA recibe el puntero al comienzo del mensaje 

daddi $t0,$0,4
sd $t0, 0($s1) 			            ; CONTROL recibe 4 y produce la salida del mensaje 


devolver_num: daddi $v0,$s2,-48
j finalrut 
error: daddi $t0, $0, msjerr              ; $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

finalrut: jr $ra
;SI SU NUMERO MÁGICO TERMINA CON  5 o 6: la subrutina PROCESAR _NUMEROS debe recibir 
;como parámetro la dirección de la tabla NUMEROS y la cantidad de elementos y contar la cantidad
; de números mayores a 5. Se debe mostrar por pantalla el valor calculado, con el
;  texto 'Cantidad de Valores mayores que 5: ' y el valor. (5 puntos)

.data 
      CONTROL: .word32 0x10000
      DATA: .word32 0x10008
      preg: .asciiz ' \n Ingrese un numero '
      msjerr: .asciiz 'Debe Ingresar un numero \n'
      msj3: .asciiz ' \n Cantidad de Valores mayores que 5: '
      aux: .word 0
      NUMEROS: .word 0
      ;SUMA DE LOS ULTIMOS 3  DIGITOS 9
.code
      lwu $s1, CONTROL($zero)
      lwu $s0, DATA($zero)

      daddi $s7,$0,0          ;Acumulador

      daddi $t6,$0,0          ;Desplazador

      daddi $t5,$0,0          ; Cantidad de elementos

      pedir:  jal INGRESAR_NUMERO
            beqz $v0,pedir
            sd $v0, NUMEROS($t6)
            dadd $s7,$s7,$v0 
            daddi $t6,$t6,8   ;Desplazador
            daddi $t5,$t5,1   ; CAntidad
            slti $s3,$s7,9    ; si el acumulador es menor a 9  $s3 = 1 else $s3= 0
            beqz $s3,seguir
      j pedir 

      seguir: daddi $a0,$0,NUMEROS
      daddi $a1,$t5,0 
      jal PROCESAR_NUMEROS

      daddi $t0, $0, msj3        ; $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 


      sd $v0, 0($s0) 				; DATA recibe el entero
      
      daddi $t0, $0, 1 			; $t0 = 1 -> función 1: salida de un entero sin signo
      sd $t0, 0($s1) 			; CONTROL recibe 1 y produce la salida del numero

halt 


PROCESAR_NUMEROS: daddi $v0,$0,0    ; Contador de 3 
daddi $t9, $0, 5        ;constante
loop: beqz $a1,finalizarRut
      ld $s4, 0($a0)
      daddi $a0,$a0,8
      daddi $a1,$a1,-1
      daddi $t7, $0,0

      slt $t7, $s4, $t9       ; si es menor que 5
      bnez $t7, loop
      
      beq $s4, $t9, loop

      daddi $v0,$v0,1       ;aumenta 1 en el contador
      j loop 
finalizarRut: jr $ra 


INGRESAR_NUMERO: 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, $0, 9                          ; $t0 = 9 -> función 9: entrada de un caracter
sd	$t0, 0($s1)     		            ; CONTROL recibe 9

lbu	$s2, 0($s0)                         ; Leo de DATA el caracter           
sb $s2,aux($0)                            ; Lo guardo

;IF ($t0 > 48 ) and ($t0  < 58 )
slti $t3,$s2,49                           ;  ($t0 < 48) ? $t3 = 1 : $t3 = 0
bnez $t3,error 
slti $t3,$s2,58                           ; ($t0 < 58) ? $t3 = 1 : $t3 = 0
beqz $t3,error
 
daddi $t0, $0, aux 	                  ; $t0 = dirección del mensaje a mostrar  
sd $t0, 0($s0) 			            ; DATA recibe el puntero al comienzo del mensaje 

daddi $t0,$0,4
sd $t0, 0($s1) 			            ; CONTROL recibe 4 y produce la salida del mensaje 


devolver_num: daddi $v0,$s2,-48
j finalrut 
error: daddi $t0, $0, msjerr              ; $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

finalrut: jr $ra