Practica 4 - Instrucciones y E - S
Practica 4 - Instrucciones y E - S
Practica 4 - Instrucciones y E - S
PRÁCTICA 4
Introducción al WinMIPS64. Instrucciones. E/S.
Objetivos: Familiarizarse con el desarrollo de programas para procesadores con sets reducidos de instrucciones
(RISC). Resolver problemas y verificarlos a través de simulaciones. Comprender el uso del puerto de E/S provisto en
el WinMIPS64.
2. VonSim vs WinMIPS64 ⭐
Indicar qué instrucciones se corresponden entre el simulador VonSim y el simulador WinMIPS64. Tener en cuenta
que algunas de las instrucciones del VonSim pueden hacerse de distintas formas en WinMIPS64. y otras no pueden
hacerse con una sola instrucción. Por ende, algunas instrucciones de la columna izquierda corresponden a varias de
la derecha, y otras no corresponden a ninguna
Nota: para simplificar, usaremos los registros del WinMIPS64 (r0 a r31) como nombres de registro en las
VonSim WinMIPS64
1/7
Arquitectura de Computadoras 2024
space 1
ascii
asciiz
byte
word16
word32
word
double
El procesador MIPS64 posee 32 registros, de 64 bits cada uno, llamados r0 a r31 (también conocidos como $0 a $31).
Sin embargo, al programar resulta más conveniente darles nombres más significativos a esos registros.
La siguiente tabla muestra la convención empleada para nombrar a los 32 registros mencionados:
5. Programas simples ⭐⭐ .
a) Lee 2 números A y B de la memoria de datos, y calcula S, P y D, que luego se guardan en la memoria de datos.
b) Dadas dos variables A y B de la memoria, calcula y almacena C
c) Calcula el factorial de N, y lo guarda en F
d) Calcula el logaritmo (entero) en base 2 de N (N positivo) mediante divisiones sucesivas y lo guarda en L
e) Guarda en B el valor 1 si A es impar y 0 de lo contrario
Los nombres de variables como A, B, C, etc, deben implementarse usando variables de tipo word a las cuales se lee y
escribe de memoria con ld y sd.
2/7
Arquitectura de Computadoras 2024
a b c d e
S = A + B if A == 0: F = 1 L = 0 if impar(A):
P = 2 + (A*B) C = 0 for i=1..N: while N > 0: B = 1
D = A^2 / B else: F = F * i N = N / 2 else:
if A > B: L = L + 1 B = 0
C = A * 2
else:
C = B
b) Calcular la suma de los 3 valores utilizando un lazo con la dirección base y un registro como desplazamiento. Pista:
Idem anterior, pero ahora con una única instrucciones de lectura y $t2 se incrementa dentro de un loop
c) Calcular la suma de los 3 valores utilizando un lazo, con una dirección base de 0 y un registro como puntero.
Pista: Cargar la dirección en un registro con daddi $t2, $zero, V y luego cargar los valores con ld $t1,
0($t2)
d) ¿Qué cambios se deberían realizar al programa del inciso b) si los elementos fueran de 32 bits: V: .word32 5,
2, 6?
8. Codificación de Strings ⭐
a) Strings en memoria: En WinMIPS los strings se almacenan como vectores de caracteres. Observar cómo se
almacenan en memoria los códigos ASCII de los caracteres (código de la letra “a” es 61H). Además, los strings se
suelen terminar con un carácter de fin con código 0, es decir el valor 0. Para definir un string en una variable y no
tener que agregar a mano el valor 0, se puede utilizar el tipo de datos asciiz. Si en lugar de eso se utiliza el tipo ascii
(sin la z) no se agrega el 0 de forma automática. Probar estas definiciones en el simulador y observar cómo se
organizan en la memoria las variables.
.data
cadena: .asciiz "ABCdef1"
cadena2: .ascii "ABCdef11"
cadena3: .asciiz "ABCdef1111111"
num: .word 5
b) Lectura de caracteres: lbu vs. lb vs. ld: En un string, cada código ASCII ocupa 1 byte. No obstante, los registros del
simulador tienen 8 bytes (64 bits) de capacidad. Por ende, al cargar un byte en un registro, se desperdician 7 bytes de
espacio; esta ineficiencia es inevitable. Más allá de eso, esta diferencia nos trae otra dificultad. Cuando se carga un
valor de memoria, no se puede utilizar ld, porque ello traería 8 caracteres (8 bytes) al registro, y sería muy difícil
hacer operaciones sobre los caracteres individuales. Por ello, existen instrucciones para traer solo un byte desde la
memoria: lbu y lb. ¿Cuál es la diferencia?
- lbu asume que el valor que se trae está codificado en BSS y entonces rellena los últimos 7 bytes con 0.
3/7
Arquitectura de Computadoras 2024
- lb asume que el valor que se trae de memoria está codificado en CA2, y entonces si el número es negativo realiza la
expansión de signo. ¿De qué trata esto? Para que el número siga valiendo lo mismo en CA2 de 8 bytes, se rellenan los
últimos 7 bytes con 1.
Para probar la diferencia entre estas 3 instrucciones, ejecutar el siguiente programa en el simulador que intenta
cargar el primer valor del vector de números datos y observar los valores finales de $t1, $t2 y $t3.
.data
datos: .byte -2, 2, 2, 2, 2, 2
.code
ld $t1, datos($zero)
lb $t2, datos($zero)
lbu $t3, datos($zero)
halt
Responde:
¿Qué registro tiene el valor “correcto” del primer valor?
¿Qué instrucción deberías utilizar de las 3 para cargar un código ASCII que siempre es positivo? Tené en cuenta que,
por ejemplo, el código ASCII de la Á es 181, que en BSS se escribe como 10110101.
.data
cadena: .asciiz "adbdcdedfdgdhdid" # cadena a analizar
car: .ascii "d" # carácter buscado
cant: .word 0 # cantidad de veces que se repite el carácter car en cadena.
c) Contar mayúsculas Escribir un programa que cuente la cantidad de letras mayúsculas de un string. Probarlo con el
string “ArquiTectuRa de ComPutaDoras”. Pista: El código ASCII de la “A” es 65, y el de la “Z” es 90.
d) Generar string Escribir un programa que genere un string de la siguiente forma: “abbcccddddeeeee….”, así hasta la
letra “h”. Para ello debe utilizar un loop e ir guardando los códigos ascii en la memoria. El string debe finalizar con el
valor ascii 0 para que esté bien formado (debe agregar un elemento más, que valga 0, al final del string).
4/7
Arquitectura de Computadoras 2024
Parte 2: Entrada/Salida
Puerto de E/S mapeado en memoria de datos En el WinMIPS, para hacer operaciones de E/S con el teclado y la
pantalla se utiliza la técnica de mapeado en memoria de datos. Para ello, se cuentan con los registros CONTROL y
DATA que se encuentran en la memoria de datos y tienen direcciones de memoria fijas. Aplicando distintos comandos
a través de CONTROL, es posible producir salidas o ingresar datos a través de la dirección DATA.
Las direcciones de memoria de CONTROL y DATA son 0x10000 y 0x10008 respectivamente. Como el set de
instrucciones del procesador MIPS64 no cuenta con instrucciones que permitan cargar un valor inmediato de más de
16 bits (como es el caso de las direcciones mencionadas), no se puede utilizar una instrucción como sd $t0,
0x10000($zero) para escribir en CONTROL. Esta limitación no impide usar los registros, pero si hace engorroso su
uso. Para usarlos es necesario primero definir variables en la memoria de datos que contengan las direcciones, y
luego cargarlas en registros.
.data
DIR_CONTROL: .word 0x10000 # DIR_CONTROL tiene la DIRECCIÓN del registro CONTROL
DIR_DATA: .word 0x10008 # IDEM para DATA
.code
ld $t0, DIR_CONTROL($zero) # Carga el valor 0x10000 en $t0
ld $t1, DIR_DATA($zero) # Carga el valor 0x10008 en $t1
Para realizar operaciones de E/S, se encuentran disponibles los siguientes códigos de CONTROL:
▪ CONTROL = 1 Si se escribe en DATA un número entero y se escribe un 1 en CONTROL, se interpretará el valor
escrito en DATA como un entero sin signo y se lo imprimirá en la pantalla alfanumérica de la terminal.
▪ CONTROL = 2 Si se escribe en DATA un número entero y se escribe un 2 en CONTROL, se interpretará el valor
escrito en DATA como un entero con signo y se lo imprimirá en la pantalla alfanumérica de la terminal.
▪ CONTROL = 3 Si se escribe en DATA un número en punto flotante y se escribe un 3 en CONTROL, se imprimirá en
la pantalla alfanumérica de la terminal el número en punto flotante.
▪ CONTROL = 4 Si se escribe en DATA la dirección de memoria del comienzo de una cadena terminada en 0 y se
escribe un 4 en CONTROL, se imprimirá la cadena en la pantalla alfanumérica de la terminal.
▪ CONTROL = 5 Si se escribe en DATA un color expresado en RGB (usando 4 bytes para representarlo: un byte para
cada componente de color e ignorando el valor del cuarto byte), en DATA+4 la coordenada Y, en DATA+5 la
coordenada X y se escribe un 5 en CONTROL, se pintará con el color indicado un punto de la pantalla gráfica de la
terminal, cuyas coordenadas están indicadas por X e Y. La pantalla gráfica cuenta con una resolución de 50x50
puntos, siendo (0, 0) las coordenadas del punto en la esquina inferior izquierda y (49, 49) las del punto en la
esquina superior derecha.
▪ CONTROL = 6 Si se escribe un 6 en CONTROL, se limpia la pantalla alfanumérica de la terminal.
5/7
Arquitectura de Computadoras 2024
.data
texto: .asciiz "Hola, Mundo!" ; El mensaje a mostrar
CONTROL: .word 0x10000
DATA: .word 0x10008
.code
ld $t0, CONTROL($zero) ; $t0 = dirección de CONTROL
ld $t1, DATA($zero) ; $t1 = dirección de DATA
daddi $t2, $zero, texto ; $t2 = dirección del mensaje a mostrar
sd $t2, 0($t1) ; DATA recibe el puntero al comienzo del mensaje
daddi $t2, $zero, 4 ; $t2 = 4 -> función 4: salida de una cadena ASCII
sd $t2, 0($t0) ; CONTROL recibe 4 y produce la salida del mensaje
halt
2. Comprobación de clave ⭐⭐
a) Comprobación simple Escriba un programa que solicite el ingreso por teclado de una clave, representada por un
string de 4 carácteres. Para indicar al usuario que debe ingresar un valor, imprimir en pantalla “Ingrese una clave de
4 carácteres”. Luego, debe comparar la secuencia ingresada con una cadena almacenada en la variable clave. Si las
dos cadenas son iguales entre sí, mostrar el texto “Clave correcta: acceso permitido” en la salida estándar del
simulador (ventana Terminal). En cambio, si las cadenas no son iguales, mostrar “Clave incorrecta.”
b) Comprobación infinita Modificar el programa anterior para solicitar nuevamente el ingreso de la clave cuando es
⭐⭐⭐
incorrecta. El programa solo termina cuando la clave ingresada es la correcta
b) Comprobación con intentos Modificar el programa anterior para que el programa termine luego de 5
intentos fallidos. Indicar la cantidad de intentos restantes con el mensaje: “Ingrese una clave de 4 carácteres (X
intentos restantes)”. Pista: Para imprimir este mensaje, utilice 3 impresiones: primero con el comienzo del string,
luego el valor X y luego el resto del string.
a) Suma de números ⭐ Escribir un programa que lea dos números enteros y muestre su suma en la salida estándar
⭐⭐
del simulador (ventana Terminal) el resultado numérico.
b) Operaciones con números Modificar a) para que además de leer los números, se lea un carácter que
corresponda a distintas operaciones: +, -, * y /. Calcule la operación correspondiente (suma, resta, multiplicación o
⭐⭐⭐
división). Asumir que el usuario siempre ingresa un carácter correspondiente a una operación válida.
c) Mini Calculadora Modificar b) para que el programa funcione como una calculadora común. Para ello, lea
primero un número, y luego lea pares de (operación, número). Cada vez que lee un par (operación, número), aplique la
misma al resultado anterior y lo muestra en la pantalla.
d) Superficie de un triángulo rectángulo ⭐⭐ Escribir un programa que calcule la superficie de un triángulo
rectángulo de base B y altura A, y almacene el resultado en una variable llamada superficie. Debe leer el valor de A y
B por teclado, y mostrar el resultado.
Pista: la superficie de un triángulo se calcula como: Superficie = (base x altura) / 2
El siguiente programa pinta el pixel con coordenadas (24,24) de la pantalla gráfica de color de magenta. Ir a Ventana
→ Terminal en el simulador WinMIPS64 para ver el resultado luego de ejecutar el programa.
.data
coorX: .byte 24 ; coordenada X de un punto
coorY: .byte 24 ; coordenada Y de un punto
color: .byte 255, 0, 255, 0 ; color: máximo rojo + máximo azul => magenta
CONTROL:.word 0x10000
DATA: .word 0x10008
6/7
Arquitectura de Computadoras 2024
.code
ld $t0, CONTROL($zero) ; $t0 = dirección de CONTROL
ld $t1, DATA($zero) ; $t1 = dirección de DATA
a) Desde teclado ⭐ Modifique el programa anterior para que las coordenadas X e Y del punto a pintar se lean de
⭐ Modifique el programa original para que el punto vaya cambiando de color, desde negro
teclado.
b) Cambio de color
⭐⭐ Modifique el programa original para pintar una línea horizontal de 50 pixeles desde el
(255,0,0) hasta rojo puro (255,0,0).
c) Línea azul 0,0
a) Cuadrado rojo de 5x5 Completa las líneas faltantes para que el programa anterior pinte un cuadrado rojo de
⭐⭐
5x5 en la esquina superior izquierda.
⭐⭐⭐
b) Pantalla verde Modifique el programa anterior para pintar toda la pantalla de verde
c) Líneas de colores Modifique el programa anterior para pintar toda la pantalla, pero cada línea de un
color distinto (idear una forma de variar los colores)
7/7