#ESTA PARTE DEL CODIGO NO CREEMOS NECESARIO EXPLICARLA DEBIDO A... #HICIESTEIS VOSOTROS ########################################

Anuncio
#ESTA PARTE DEL CODIGO NO CREEMOS NECESARIO EXPLICARLA DEBIDO A QUE LA
#HICIESTEIS VOSOTROS
########################################
# Segmento de datos
########################################
.data 0x10010000
# Reservamos espacio para almacenar las matrices
# las matrices pueden inicializarse aquí y así se evita la tediosa labor de cargar su valor
# cada vez que se pretenda depurar errores.
A: .space 104
B: .space 104
C: .space 104
# se almacenan diferentes menús
pantalla: .ascii "\n Fundamentos de Computadores "
.ascii "\n Telemática "
.ascii "\n Cartagena. Curso 2000/01 "
.ascii "\n\n"
.ascii "\n −−−−−−−−−−−−−−−−−−−−−−−−−−−− "
.ascii "\n Opciones "
.ascii "\n −−−−−−−−−−−−−−−−−−−−−−−−−−−− "
.ascii "\n 1. Introducir una matriz."
.ascii "\n 2. Visualizar una matriz."
.ascii "\n 3. Calcular la traspuesta."
.ascii "\n 4. Determinante."
.ascii "\n 5. Sumar dos matrices."
.ascii "\n 6. Multiplicar por escalar."
1
.ascii "\n 7. Salir del programa."
.ascii "\n\n"
.ascii "\n −−−−−−−−−−−−−−−−−−−−−−−−−−−− "
.asciiz "\n\t Seleccione alguna de las opciones: "
# Se almacenan las direcciones a las que saltar en función de la opción seleccionada
etiquetas_menu: .word opcion1, opcion2, opcion3, opcion4, opcion5, opcion6, opcion7
# Menú de introducción
elegir_matriz: .ascii "\n −−−−−−−−−−−−−−−−−−−−−−−−−−−− "
.ascii "\n Opciones "
.ascii "\n −−−−−−−−−−−−−−−−−−−−−−−−−−−− "
.ascii "\n 1. Introducir matriz A. "
.ascii "\n 2. Introducir matriz B. "
.ascii "\n\n"
.ascii "\n −−−−−−−−−−−−−−−−−−−−−−−−−−−− "
.asciiz "\n\t Seleccione la matriz que desea introducir: "
etiquetas_mat: .word opcionA, opcionB
# Menú de visualización
v_elegir_matriz: .ascii "\n −−−−−−−−−−−−−−−−−−−−−−−−−−−− "
.ascii "\n Opciones "
.ascii "\n −−−−−−−−−−−−−−−−−−−−−−−−−−−− "
.ascii "\n 1. Visualizar matriz A. "
.ascii "\n 2. Visualizar matriz B. "
.ascii "\n 3. Visualizar matriz C. "
.ascii "\n\n"
.ascii "\n −−−−−−−−−−−−−−−−−−−−−−−−−−−− "
.asciiz "\n\t Seleccione la matriz que desea visualizar: "
2
etiquetas_vmat: .word v_opcionA, v_opcionB, v_opcionC,
ret: .asciiz "\n"
tab: .asciiz "\t"
# identificadores de matriz
matrizA: .asciiz "A"
matrizB: .asciiz "B"
matrizC: .asciiz "C"
datosde: .asciiz "Datos de la matriz "
abrecor: .asciiz "["
cierracor: .asciiz "]= "
coma: .asciiz ", "
numerofilas: .asciiz "Introduzca el número de filas: "
numerocolumnas: .asciiz "Introduzca el número de columnas: "
# mensajes de error
mensajerror: .asciiz "\nLa matriz que desea visualizar NO TIENE datos."
mmensajeerror: .asciiz "\nNo puede multiplicar dos matrices que no tengan igual número de filas y columnas
respectivamente."
smensajeerror: .asciiz "\nNo puede sumar/restar dos matrices que no tengan igual dimensión."
Det_error: .asciiz "\nNo puede calcularse un determinate superior a 3x3."
peticionescalar: .asciiz "\nIntroduzca el escalar por el que desea multiplicar la matriz A: "
# Opciones implementadas
opc1: .asciiz "Procedimiento para introducir una mátriz"
opc2: .asciiz "Procedimiento para visualizar una mátriz"
opc3: .asciiz "Procedimiento para calcular la traspuesta de la matriz A y la guarda en C"
opc4: .asciiz "Procedimiento para calcular el determinante"
opc5: .asciiz "Procedimiento para sumar dos matrices. 0 Suma 1 Resta "
opc6: .asciiz "Procedimiento para multiplicar por escalar"
3
opc7: .asciiz "Procedimiento para salir del programa"
#MESAJES QUE SE MUESTRAN EN LA VENTANA CUANDO SE EJECUTA EL CÓDIGO
mensajedepu: .asciiz "\nHasta aquí ha llegado bien." #ESTE ES BUESTRO
mensaje_det: .asciiz "El determinante de A es : "
########################################
#
# Segmento de código
#
########################################
# Programa principal.....
# Se muestra el menú de opciones posibles y se espera que el usuario seleccione una de ellas
.text
.globl __start
__start:
jal limpiar
jal mostrar_menu
li $8, 4
addi $2, $2, −1
mult $8, $2
mflo $9
la $10, etiquetas_menu
add $11, $10, $9
lw $11, 0($11)
jr $11
opcion1: jal introducir
j __start
4
opcion2: jal visualizar
j __start
opcion3: jal traspu
j __start
opcion4: jal determinante
j __start
opcion5: jal sumar
j __start
opcion6: jal multescalar
j __start
opcion7: jal abandonar
#rutina de comprobacion de la existencia de datos
#dentro de la matriz
vacio: la $4,mensajerror
li $2,4
syscall
li $2,5
syscall
jr $31
########################################
# Muestra el menú de opciones y
# recoge la opción seleccionada.
# Sale del menú cuando se selecciona
# una opción posible.
########################################
mostrar_menu: addi $29, $29, −8 #PARA ELLO USAMOS UNA PILA
5
sw $8, 4($29)
sw $31, 0($29)
li $2, 4
la $4, pantalla
syscall
li $2, 5
syscall
slti $8, $2, 8 #máxima opción 7
beq $8, $0, mostrar_menu
lw $8, 4($29)
lw $31, 0($29)
addi $29, $29, 8
jr $31
########################################
# Opcion1. Introducir una matriz
########################################
introducir: addi $29, $29, −8
sw $8, 4($29)
sw $31, 0($29)
li $2, 4
la $4, opc1
syscall
li $2, 4
la $4, elegir_matriz
syscall
li $2, 5
6
syscall
slti $8, $2, 3
beq $8, $0, introducir
li $8, 4
addi $2, $2, −1
mult $8, $2
mflo $9
la $10, etiquetas_mat
add $11, $10, $9
lw $11, 0($11)
jal limpiar
jr $11
opcionA: la $4, A
la $5, matrizA
jal pedir
jal pausa
jal continuar
opcionB: la $4, B
la $5, matrizB
jal pedir
jal pausa
jal continuar
continuar: lw $8, 4($29)
lw $31, 0($29)
addi $29, $29, 8
jr $31
7
########################################
# Pedir matriz
# en $4 se pasa la dirección de la matriz a cargar
# en $5 tenemos el identificador
# los datos de entrada se almacenan de la siguiente forma
# Primero destinando media palabra para ello el número de filas de la matriz
# Segundo destinando media palabra para ello el número de columnas de la matriz
# Seguidamente se almacenan cada una de las componentes de la matriz destinando un byte
########################################
pedir: addi $sp, $sp, −20
sw $10, 16($sp) # número de columnas
sw $9, 12($sp) # número de filas
sw $8, 8($sp) # registro intermedio
sw $4, 4($sp)
sw $5, 0($sp)
li $2, 4
la $4, datosde
syscall
li $2, 4
lw $4, 0($sp)
syscall
li $2, 4
la $4, ret
syscall
fil: li $2, 4
la $4, numerofilas
8
syscall
li $2, 5
syscall
blez $2, fil
lw $8, 4($sp)
sh $2, 0($8)
move $9, $2
col: li $2, 4
la $4, numerocolumnas
syscall
li $2, 5
syscall
blez $2, col
lw $8, 4($sp)
sh $2, 2($8)
move $10, $2
lw $8, 4($sp)
addi $8, $8, 4
# repetir hasta número de filas
li $11, 0
rep_i: li $12, 0
rep_j: li $2, 4
lw $4, 0($sp)
syscall
li $2, 4
la $4, abrecor
9
syscall
li $2, 1
move $4, $11
syscall
li $2, 4
la $4, coma
syscall
li $2, 1
move $4, $12
syscall
li $2, 4
la $4, cierracor
syscall
li $2, 5
syscall
# Guardar el dato recogido.........................................
sb $2, 0($8)
add $8, $8, 1
addi $12, $12, 1
bne $12, $10, rep_j
li $2, 4
la $4, ret
syscall
addi $11, $11, 1
bne $11, $9, rep_i
lw $10, 16($sp) # número de columnas
10
lw $9, 12($sp) # número de filas
lw $8, 8($sp)
lw $4, 4($sp)
lw $5, 0($sp)
addi $sp, $sp, 20
jr $31
########################################
# Opcion2. Visualizar una matriz
########################################
visualizar: addi $29, $29, −8
sw $8, 4($29)
sw $31, 0($29)
li $2, 4
la $4, opc1
syscall
li $2, 4
la $4, v_elegir_matriz
syscall
li $2, 5
syscall
slti $8, $2, 4
beq $8, $0, visualizar
li $8, 4
addi $2, $2, −1
mult $8, $2
mflo $9
11
la $10, etiquetas_vmat
add $11, $10, $9
lw $11, 0($11)
jal limpiar
jr $11
v_opcionA: la $4, A
la $5, matrizA
li $6, 0
jal mostrar
jal pausa
jal continuar
v_opcionB: la $4, B
la $5, matrizB
li $6, 0
jal mostrar
jal pausa
jal continuar
v_opcionC: la $4, C
la $5, matrizC
li $6, 1
jal mostrar
jal pausa
jal continuar
# OPCION D ELIMINADA POR QUE NO NECESITAMOS USARLA
# YA QUE PASAMOS LOS DATOS SIEMPRE A LA MATRIZ C
jr $31
12
########################################
# mostrar: Procedimiento que muestra la matriz pasada como argumento
# entradas: $4: dirección donde comienza la matriz a mostrar
# $5: identificador de la matriz a visualizar
########################################
mostrar: addi $sp, $sp, −20
sw $10, 16($sp) # número de columnas
sw $9, 12($sp) # número de filas
sw $8, 8($sp) # registro intermedio
sw $4, 4($sp)
sw $5, 0($sp)
li $2, 4
la $4, datosde
syscall
li $2, 4
lw $4, 0($sp)
syscall
li $2, 4
la $4, ret
syscall
lw $8, 4($sp)
lh $9, 0($8)
lh $10, 2($8)
addi $8, $8, 4
beq $9, $0, verror
beq $10, $0, verror
13
j vcontinuar
verror: li $2, 4
la $4, mensajerror
syscall
j vsalir
vcontinuar:
# repetir hasta número de filas
li $11, 0
vrep_i: li $12, 0
vrep_j: li $2, 4
lw $4, 0($sp)
syscall
li $2, 4
la $4, abrecor
syscall
li $2, 1
move $4, $11
syscall
li $2, 4
la $4, coma
syscall
li $2, 1
move $4, $12
syscall
li $2, 4
la $4, cierracor
14
syscall
beq $6, $0, vbyte
# Cargar el dato correspondiente.........................................
# La matriz de resultado de operaciones C no tiene como componentes #datos de tipo byte
# sino palabra, por ello si deseamos ver la matriz C debemos acceder a #palabra e ir de 4 en 4
lw $4, 0($8)
add $8, $8, 4
j vcont
vbyte: lb $4, 0($8)
add $8, $8, 1
vcont: li $2, 1
syscall
li $2, 4
la $4, tab
syscall
addi $12, $12, 1
bne $12, $10, vrep_j
li $2, 4
la $4, ret
syscall
addi $11, $11, 1
bne $11, $9, vrep_i
vsalir: lw $10, 16($sp) # número de columnas
lw $9, 12($sp) # número de filas
lw $8, 8($sp)
lw $4, 4($sp)
15
lw $5, 0($sp)
addi $sp, $sp, 20
jr $31
########################################
# Opcion3. Calcular la traspuesta
# Procedimiento que calcula la traspuesta de A y la guarda en C
########################################
traspu:
li $2, 4
la $4, opc3
syscall
# implementar aquí......................
addi $sp,$sp,−4 #AQUI RESERVAMOS UNA PALABRA EN PILA
sw $31,0($sp) #AQUI GUARDAMOS LA POSCION DE RETORNO EN PILA
lh $9,A #LEEMOS LOS PRIMEROS BYTES DE LA MATRIZ A
beqz $9, vacio #SI NO HAY FILAS ESTA VACIA SI HAY
lh $10,A+2 #LEEMOS LA SEGUNDA Y ULTIMA PALBRA Y
sh $10,C #GUARDAMOS ENTONCES LAS DIMENSIONES EN C
sh $9,C+2 #FILAS Y COLUMNAS C Y C+2
la $13,A+4 #CARGAMOS EL PRIMER ELEMENTO MATRIZ A
li $11,0 #POMEMOS A 0 EL REG 11 DONDE METEREMOS DATOS
columnas: li $12,0 #INICIALIZAMOS LAS COLUMNAS A 0
trasponer: lb $14,0($13) #CARGAMOS EN $14 EL PRIMER BYTE DE MATRIZ A
move $4,$9 #CARGAMOS EN LOS DATOS EN LOS REGISTROS $4 $6 $5
move $6,$11 #QUE SON LOS QUE HEMOS USADO EN LA RUTINA
move $5,$12 #POSICION PARA CALCULAR LA POSICION DE LOS
16
li $7,4 #DATOS DENTRO DE LA MATRIZ Y PODER GIRARLA
jal posicion #AQUÍ LLAMAMOS A LA SUBSODICHA RUTINA
la $15,C #AL VOLVER DE LA RUTINA CARGAMOS C EN $15
add $15,$15,$2 #Y LE SUMAMOS (i*n+j)*tamaño+4 == DESPLAZAMIENTO
sw $14,0($15) #ALMACENAMOS EL ELEMENTO Y PASAMOS AL SIGUIENTE
addi $13,$13,1 #Y PASAMOS AL SIGUIENTE ELEMENTO DE A FILA
addi $12,$12,1 # Y TAMBIEN COLUMNA
bne $12, $10,trasponer #SI NO HEMOS LLEGADO AL FIN REPETIMOS
addi $11,$11,1 #INCREMENTAMOS LAS FILAS Y SI NO SON IGUAL
bne $11,$9,columnas #A LAS COLUMNAS DICHAS AL PRINCIPIO SEGUIMOS
lw $31,0($sp) #SI HEMOS LLEGADO AL FINAL, LEEMOS LA DIREC DE
addi $sp,$sp,4 #RETORNO DE LA PILA Y VOLVEMOS AL MENU PRINCIPAL
jr $31
########################################
#Opcion 4: Calcular el determinante de A ########################################
determinante:li $2, 4 #AQUÍ EMPEZAMOS A IMPLEMENTAR LA FUNCION QUE
la $4, opc4 #CALCULA EL VALOR DEL DETERMINANTE DE LA
syscall #MATRIZ "A"
la $4,A #LEEMOS LA DIRECCION DE LA MATRIZ
li $16,−1 #Y CARGAMOS LOS VALORES PARA PODER HACER
li $17,1 #UNA COMPARACION Y PODER ASI DECIDIR SU
li $18,2 #RANGO Y LLEVAR LOS DATOS AL METODO NECESARIO
li $19,3 #TAMBIEN HEMOS CARGADO EL −1 PARA HACER RESTAS
lb $5,2($4) #LEEMOS LAS COLUMNAS DE LA MATRIZ "A" (A=$4)
beq $5,$0, vacio #SI NO HAY COLUMNAS NO HAY MATRIZ =ERROR VACIO
lb $6,0($4) #SI HAY COLUMNAS LEEMOS LA FILAS QUE HAY
17
beq $6,$0, vacio #SI NO HAY FILAS NO HAY MATRIZ = ERROR DE VACIO
bne $5,$6, error_det #SI LAS FILAS<> A LAS COLUMNAS NO SE PUEDE
beq $5,$17, orden_1 #AQUÍ CALCULAMOS EL ORDEN DE LA MATRIZ SI ES
beq $5,$18, orden_2 #DE ORDEN1, 2, Ó 3 PARA ELEGIR LA RUTINA DE
beq $5,$19, orden_3 #CALCULO APROPIADA, SI ES IGUAL O MAYOR QUE
bge $5,4, error_det #ORDEN 4 ERROR NO PUEDO CALCULARLO (Bge)
orden_1: lb $7,4($4) #SI SU ORDEN ES UNO NO HAY TU TIA EL DATOS ES
j result #ES EL RESULTADO Y LO PASAMOS EN $7
orden_2: lb $8,4($4) #PASAMOS LA PARATE ALTA DE $4=A HACIA $8
lb $9,7($4) #LEMOS EL DATO 1,1 Y 2,2 DE LA MATRIZ
mult $8,$9 #AQUI LOS MULTIPLICAMOS Y SU RESULTADO
mflo $5 #NOS LO COGEMOS DE LO Y GUARDAMOS EN $5
lb $8,5($4) #LEEMOS EL DATO 1,2 Y TAMBIEN LEEMOS
lb $9,6($4) #EL DATO 2,1 DE LA MATRIZ Y A CONTINUACION
mult $8,$9 #LOS MULTIPLICAMOS Y EL RESULTADO LO MOVEMOS
mflo $6 #DE LO HACIA $6 DONDE LO MULTIPLICAMOS POR
mult $6,$16 #EL REGISTRO $16 QUE VALE −1 Y RESTAMOS LOS
mflo $6 #LOS DOS TERMINOS CON UNA SIMPLE SUMA PORQUE
add $7,$6,$5 #LE HEMOS CAMBIADO EL SIGNO Y GURADAMOS EL
j result #RESULTADO EN $7 PARA IPRIMIRLO EN PANTALLA
orden_3: lb $8,4($4) #SI EL DETERMINANTE ES DE ORDEN 3 USAMOS SARROUS
lb $9,8($4) #LEEMOS EL DATO 1,1 Y 2,2 LO MULTPLICO A CONTINUA
mult $8,$9 #CION Y EL RESULTADO TRAIGO DE LO A $9 Y LEO EL
mflo $9 #BIT QUE ME QUEDA DE LA DIAGONAL PPAL EL 3,3 Y
lb $8,12($4) #LO MULTIPLICO POR EL RESULTADO DE ANTES Y ESTO
mult $8,$9 #QUE ME DA LO GUARDO EN EL REGISTRO $5
18
mflo $5
lb $8,5($4) #SEGUIMOS CON SARROUS, AQUI LEEMOS LOS DATOS
lb $9,9($4) # LEEMOS EL DATO 1,2 Y EL 2,3 LOS MULTIPLICAMOS
mult $8,$9 #Y EL RESULTADO NOS LO TRAEMOS DE LO Y LO
mflo $9 #PASAMOS AL REGISTRO $9 QUE LO MULTIPLICAMOS
lb $8,10($4) #CON ESTE DATO QUE COGEMOS DE A POSICION 3,1
mult $8,$9 #Y EL RESULTADO LO ALMACENAMOS DESDE LO
mflo $6 # AL REGISTRO $6 Y SUMAMOS LOS DOS PRIMEROS
add $7,$5,$6 #RESULTADOS Y LOS GUARDAMOS EN $7
lb $8,6($4) #AQUI HACEMOS EL SEGUNDO TRIANGULO CON LOS DATOS
lb $9,7($4) #CORRESPONDIENTES A LAS POSICIONES 1,3 Y 2,1 DE
mult $8,$9 #LA MATRIZ, LOS MULTIPLICO Y GUARDO SU RESULTADO
mflo $9 #EN EL REGISTRO $9
lb $8,11($4) #AQUI LEO EL DATO DE LA MATRIZ 3,2 PARA MULTIPLI
mult $8,$9 #CARLO POR EL RESULTADO ANTERIOR, PARA SUMMARLO
mflo $6 # AL VALOR QUE OBTUBE LA DIAGONAL Y DEL PRIMER
add $7,$6,$7 #TRIANGULO, Y LO GUARDO TODO EN $7
lb $8,6($4) #AHORA CALCULO LA DIAGONAL INVERSA CON LOS DATOS
lb $9,8($4) #QUE EN TEORIA OCUPAN LA POSICION 1,3 MULTIPLICADO
mult $8,$9 #POR EL DE LA POSICION 2,2 Y RECOJO EL RESULTADO
mflo $9 #EL REGISTRO $9, A CONTINUACION SIGO CALCULANDO
lb $8,10($4) #EL ULTIMO DATO DE LA DIAGONAL INVERSA EL 3,1
mult $8,$9 #Y AQUI LO MULTIPLICO POR EL VALOR DE EL PRODUCTO
mflo $9 #DE LOS DOS ANTERIORES EL RESULTADO LO CARGO EN $9
mult $9,$16 #CON ESTO LO MULTPLICO POR −1 Y LO HAGO NEGATIVO
mflo $6 #PARA ASÍ NO TENER QUE RESTAR, SOLO LO SUMO A $6
19
add $7,$6,$7 #QUE ES EL RESULTADO DE ANTES AL CUAL TENGO QUE
#SEGUIR RESTANDOLE EL RESULTADO DE LOS 2 TRIANGULO
lb $8,5($4) #AQUI LEO LOS DATOS 1,2 Y 2,1 PARA EMPEZAR A
lb $9,7($4) #CALCULAR EL PRIMER TIRIANGULO,
mult $8,$9 #LOS MULTIPLICO Y EL RESULTADO ME LO TRAIGO
mflo $9 #Y LO GUARDO EN $9
lb $8,12($4) #AQUI CALCULO EL TERCER VERTICE DE LA POSICION
mult $8,$9 #3,3 Y LO SUMO A LO ANTERIOR GUARDANDOLO TODO
mflo $9 #EN $9, A CONTINUACION LO MULTIPLICO POR −1
mult $9,$16 #PARA HACER UNA SUMA EN VEZ DE UNA RESTA
mflo $6
add $7,$6,$7 #Y AQUI SE LO SUMO A LOS VALORES ANTERIORES
lb $8,4($4) #POR FIN CALCULO EL ULTIMO TRIANGULO CORRESPO
lb $9,9($4) #DIENTE A LOS DATOS DE LAS POSICIONES 1,1
mult $8,$9 #2,3 Y 3,2 REPITIENDO LAS OPERACIONES COMO
mflo $9
lb $8,11($4)
mult $8,$9 #ANTES Y MULTIPLICANDO EL VALOR OBTENIDO
mflo $9 #POR −1 SUMANDOLO AL TOTAL QUE LLEVAVA Y
mult $9,$16
mflo $6 #LO GUARDO EN EL REGISTRO $7
add $7,$6,$7
bne $10,255,result #AQUÍ SALTA A LA RUTINA PARA MOSTRAR LA SOLUCION
jr $31
result: move $10,$0 #PONEMOS A CERO $10
li $2, 4 #INTRODUCIMOS UN SALTO DE CARRO
20
la $4, ret
syscall
li $2, 4
la $4, mensaje_det #PONEMOS LA FRASE DEL RESULTADO
syscall
move $4,$7 #MOVEMOS EL RESULTADO A $4 PARA PODER
li $2,1
syscall
li $2, 5 #IMPRIMIRLO EN PANTALLA
syscall
jr $31 #AQUÍ VOLVEMOS AL MENU PPAL
error_det: move $10,$0 #SI POR CASUALIDAD NOS DA UNA ERROR
la $4,det_error #DEL ORDEN AQUÍ TRATAMOS ESE ERROR
li $2,4 #DANDO UN MESAJE EN PANTALLA
syscall
li $2,5 #CON ESTO METEMOS UNA PAUSA
syscall
jr $31 #CON ESTO REGRESAMOS AL MENU PPAL
########################################
# Pausa
########################################
pausa:
li $2, 5
syscall
jr $31
########################################
21
# Limpiar la pantalla
# introduce 25 "\n"
########################################
limpiar: addi $29, $29, −8
sw $9, 4($29)
sw $8, 0($29)
li $8, 0
bucle: li $2, 4
la $4, ret
syscall
addi $8, $8, 1
slti $9, $8, 25
beq $9, $0, bucle
lw $9, 4($29)
lw $8, 0($29)
addi $29, $29, 8
jr $31
########################################
# Opcion 5: Sumar dos matrices (c <= a+b)
########################################
sumar:
li $2,4
la $4,opc5
syscall
# implementar aquí......................
li $2,5 #AQUI PEDIMOS EL NUMERO 1=RESTA 0=SUMA
22
syscall
move $7,$2 #Y LO GUARDAMOS EN $7
la $4,A #LEEMOS LAS 3 MATRICES A, B Y C
la $5,B
la $6,C
lh $9,0($4) #LEEMOS LAS FILASDE A
lh $11,0($5) #Y TAMBIEN LAS DE B
beqz $9, vacio #COMPROBAMOS SI A O B ESTAN VACIAS Y
beqz $11, vacio #SI LO ESTAN VAMOS A LA RUTINA VACIO
lh $10,2($4) #SINO ESTAN VACIAS LEEMOS LAS COLUMNAS
lh $12,2($5) #DE AMBAS MATRICES
bne $9,$11,error1 #SI NO COINCIDEN LAS FILAS O LAS
bne $10,$12,error1 #COLUMNAS DE AMBAS VAMOS A ERROR1
sh $9,0($6) #SI SI COINCIDEN SALVAMOS EN C EL NUMERO
sh $10,2($6) #DE FILAS Y DE COLUMNAS
addi $4,$4,4 #Y SUMAMOS MEDIA PALABRA A TODAS LAS
addi $5,$5,4 #MATRICES PARA EMPEZAR A COLOCARLE ELEMENTOS
addi $6,$6,4
li $11,0 #RESETEO EL REGISTRO $11
filas: li $12,0 #Y TAMBIEN EL 12 PARA RENICIAR LAS FILAS
colum: lb $13,0($4) #LAS COLUMNAS DE LAS MATRICES A Y B
lb $14,0($5)
beq $7,$0,suma #SI $7 VALE 0 SALTA A LA RUTINA SUMA
li $24,1 #SINO COGEMOS Y PONEMOS $24 (pqsi)LO PONEMOS
bgt $7,$24, __start #A 1 Y SI $7>1 SALTA A __start PORQUE
sub $15,$13,$14 #EL USUARIO SE HA EQUIVOCADO, Y SI ES IGUAL A 1
23
j sigue #RESTAMOS A MENOS B Y LO GUARDAMOS EN $15
suma: add $15,$13,$14 #AQUÍ SUMAMOS A +B
sigue: sw $15,0($6) #UNA VEZ SUMADOS LOS PRIMEROS VALORES
addi $4,$4,1 #INCREMENTAMOS UNA POSICION EN CADA
addi $5,$5,1 #MATRIZ, LA A Y LA B
addi $6,$6,4 #Y PREPARAMOS LA MATRIZ C PARA PASARLE LOS DATOS
addi $12,$12,1 #Y SUMAMOS UNO AL REGISTRO $12 QUE TENIAMOS A 0
bne $12,$10,colum #DONDE LE PASAMOS EL VALOR DE LAS COLUMNAS
addi $11,$11,1 #AQUÍ TAMBIEN PREPARAMOS $11 PARA PASARLE
bne $11,$9,filas #EL VALOR DE LAS FILAS
li $2,5 #AQUI METEMOS UN ENTERO E FORMA DE PAUSA
syscall
jr $31 #Y SIN NADA MAS QUE OFRECER NOS VAMOS
error1: li $2,4 #AQUÍ DESARROLLAMOS LA RUTINA DE ERROR SI
la $4,smensajeerror
syscall #LAS MATRICES NO LLEGAN A SER CUADRADAS
li $2,5
syscall
jr $31
########################################
# Opcion 6: Multiplicar por un escalar (C <= e*A)
########################################
multescalar: li $2, 4
la $4, opc6
syscall
# implementar aquí......................
24
li $2,4 #PREPARAMOS PARA LEER UNA CADENA
la $4,peticionescalar
syscall #IMPRIMIMOS EN PANTALLA LA PETICION DEL Nº
li $2,5 #LEEMOS EL NUMERITO
syscall
move $5,$2 #PONEMOS EL NUMERITO EN $5
la $8,A #LEEMOS LA DIRECCION DE LA MATRIZ A
la $13,C #Y COMO LA DE C TAMBIEN
lh $9,0($8) #LEEMOS LAS DIMENSIONES DE A Y GUARDAMOS
lh $10,2($8) #LA PARTE BAJA EN $9 Y LA ALTA EN $10
sh $9,0($13) #Y SALVAMOS LA PARTE BAJA DE A EN C
beqz $9, vacio #COMPROBAMOS QUE NO ESTA VACIA SINO ERROR
sh $10,2($13) #SALVAMOS LA PARTE ALTA DE A EN C (COLUMNASDE C)
addi $8,$8,4 #INCREMENTAMOS 4 PARA LEER LOS DATOS DE A
addi $13,$13,4 #TAMBIEN INCREMENTAMOS C PARA PREPARARLA
li $11,0 #YRESETEAMOS $11 QUE NOS HACE FALTA
rep_fil: li $12,0 #PONEMOS LAS FILAS A CERO
rep_col: lb $4,0($8) #Y CARGAMOS EL PRIMER DATO DE A EN $4
mul $7,$5,$4 #MULTIPLICAMOS ESE DATO POR EL ESCALAR
addi $8,$8,1 #INCREMENTAMOS LA MATRIZ A EN 1
sw $7,0($13) #Y LO SALVAOS EN LA PRIMERA POSICION DE C
addi $13,$13,4 #INCREMENTAMOS C PARA LA NUEVA PALABRA
addi $12,$12,1 #INCREMENTAMOS LAS COLUMNAS
bne $12,$10,rep_col #SI COLUMNAS DE A DISTINTO DE C REPITE
addi $11,$11,1 #INCREMENTO LAS FILAS
bne $11,$9,rep_fil #Y SI NO LLEGO TODAVIA REPITO EL BUCLE
25
jr $31
########################################
# Opcion 7: Salir del programa. (Exit)
########################################
abandonar:
li $2,4 #CON ESTO COMO QUE TERMINAMOS YA QUE ESTA BIEN
la $4,opc7
syscall
li $2,4 #UNA PAUSA TONTA
la $4,ret
syscall
li $2, 10 #Y NOS SALIMOS DEL PROGRAMA ***ADIOS****
syscall
########################################
# Posición de memoria
# Procedimiento que devuelve el desplazamiento
# que ocupará el dato cuyas coordenadas se pasan como argumento
# entradas: $4: numero de columnas
# $5: i
# $6: j
# $7: tamaño
# salida: $2: desplazamiento: ((i*n+j)*tamaño+4)
########################################
posicion:
# utilizo el mismo procedimiento para acceder a datos de tipo byte o palabra
# la unica diferencia es que se haya utilizado el parámetro 4 ($7) no metiendo
26
# nada (0 = utilizado para direccionar bytes ) o pasando 4 (utilizado para acceder a palabras)
beq $7, $0, ini #AQUI IMPLEMETAMOS UNOS CONTADORES PARA ESCANEAR
j cont #LAS MATRICES Y ASÍ SABER EN QUE POSICION STAN
ini: add $7, $0, 1 #LOS DATOS Y PODER TRASPONERLOS .
cont: mult $4, $5 # i*n
mflo $2 #AQUI APLICAMOS LA FORMULA QUE NOS
add $2, $2, $6 # i*n+j #INDICASTEIS ARRIBA PARA CALCULARLO
mult $2, $7
mflo $2
add $2, $2, 4 # (i*n+j)*tamaño+4
move $7, $0
jr $31 #CON ESTO NOS VOLVEMOS AL MENU PRINCIPAL (por si habia dudas)
#######################Aquí se acabó todo ################################
INDICE DE COLORES
plantilla original
codigo fuente realizado por nosotros
comentarios esplicativo del codigo fuente
comentarios diversos
CODIGO
FUENTE
EJECUTABLE
27
Descargar