ENTREGA PREVIA 2
SEMANA 5
GRUPO
B03-28
INTEGRANTES
Gaia Vanina Gómez Rodríguez
David Leonardo Caicedo Calderón
Jhobardelson Zuluaga García
Esteban Zuluaga
Marlon Gonzalez Bello
ARQUITECTURA DEL COMPUTADOR
TUTOR
José León León
INSITUCIÓN UNIVERSITARIA POLITÉCNICO GRANCOLOMBIANO
Abril de 2025
SEMANA 2
Especificar qué tipos de instrucciones pueden ser requeridas para la solución del
problema, de acuerdo con el algoritmo diseñado.
Problema 3:
Programa que determina ¿cuál es el mayor de tres números dados?
1. Instrucciones de Entrada (Lectura de datos):
Propósito: Permiten al programa obtener los datos de entrada proporcionados por
el usuario.
Instrucción: Leer
Descripción: Se utiliza para leer los tres números ingresados por el usuario, los
cuales se almacenan en las variables numero1, numero2, y numero3.
Ejemplo: Leer numero1, Leer numero2, Leer numero3.
2. Instrucciones de Comparación:
Propósito: Permiten comparar los números y determinar cuál es el mayor o si los 3
números son iguales(Esto como validación adicional y para que la resolución del
programa quede más completa con sus validaciones).
Instrucción: Si... Entonces... Sino
Descripción: Es una estructura condicional que permite realizar una comparación
entre los tres números. Se utiliza para verificar cuál de los números es mayor y
tomar la decisión adecuada.
Ejemplo:
Imagen 1 – Ejemplo Pseudocódigo elegido a solucionar
3. Instrucciones de Salida (Mostrar resultados):
Propósito: Permiten al programa mostrar el resultado final, es decir, el número
mayor o el mensaje “Los números son iguales”.
Instrucción: Escribir
Descripción: Se utiliza para imprimir el resultado en pantalla. En este caso, el
número mayor es mostrado al usuario.
Ejemplo: Escribir "El mayor número es: ", numero1.
Ejemplo: Escribir "Los números son iguales."
4. Instrucciones de Asignación:
Propósito: Permiten almacenar los valores ingresados por el usuario en las
variables y las comparaciones de los números.
Instrucción: Definir
Descripción: Se utilizan para declarar las variables en las que se almacenan los tres
números ingresados y para almacenar el valor del número mayor si es necesario.
Ejemplo: Definir numero1, numero2, numero3 Como Real.
Resumen de las instrucciones requeridas:
1. Entrada de datos: Leer numero1, Leer numero2, Leer numero3.
2. Comparación de valores: Si... Entonces... Sino.
3. Salida de resultados: Escribir "El mayor número es: ", numero X o Escribir "Los
números son iguales."
4. Definición de variables: Definir numero1, numero2, numero3 Como Entero.
SEMANA 5
1. Listado de instrucciones detallando por cada una:
a. Nombre, nemónico, parámetros que recibe o variables involucradas.
Nemónico:
El nemónico en este caso hace referencia al nombre del algoritmo, el nombre del
algoritmo (NumeroMayorDeLosTres) puede considerarse el nemónico que
representa su funcionalidad.
Parámetros que recibe o Variables involucradas:
El algoritmo no recibe parámetros de entrada explícitos al momento de su
ejecución, pero se definen tres variables de tipo Entero (int) dentro del algoritmo.
Estas variables son:
numero1: Recibe el primer número ingresado por el usuario.
numero2: Recibe el segundo número ingresado por el usuario.
numero3: Recibe el tercer número ingresado por el usuario.
b. Descripción de una frase indicando qué hace en términos de lo que recibe como
parámetro.
El algoritmo recibe tres números enteros (numero1, numero2, numero3) e indica
cuál de ellos es el mayor. Si los tres números son iguales, informa que los números
son iguales. Si no, evalúa cuál de los tres es el mayor y lo muestra.
2. Definición de la cantidad de registros que se usarán y el tamaño de cada registro.
El algoritmo no utiliza registros en sentido estricto (como registros de bases de datos),
pero si habláramos de almacenar los números ingresados por el usuario como registros, la
cantidad de registros sería 3, ya que el algoritmo recibe tres números (números 1, 2 y 3).
El tamaño de cada registro dependerá del tipo de datos que se está utilizando. En muchos
lenguajes de programación, un entero puede ocupar 4 bytes (dependiendo del sistema o
del tipo específico de entero).
3. Descripción breve de los modos de direccionamiento que pueden se posibles.
Son técnicas que los procesadores utilizan para especificar cómo se encuentran y acceden
los operandos (los valores o direcciones de memoria) en una operación. Dependiendo del
modo de direccionamiento, un valor puede estar directamente en el registro del
procesador, en una dirección de memoria, o calculado dinámicamente.
Direccionamiento Directo
Descripción: La dirección de la memoria donde se encuentra el operando está
especificada directamente en la instrucción.
Uso: El procesador accede directamente a la dirección especificada en la
instrucción para obtener el operando.
Direccionamiento Indirecto
Descripción: La dirección de memoria se obtiene de un registro o de una ubicación
de memoria que contiene la dirección.
Uso: Se utiliza cuando se quiere acceder a una ubicación de memoria cuya
dirección está almacenada en un registro.
Direccionamiento de Registro
Descripción: El operando se encuentra en un registro específico del procesador.
Uso: Se utiliza cuando el operando está contenido en uno de los registros del
procesador.
Direccionamiento de Registro Indirecto
Descripción: El registro contiene una dirección de memoria, y la instrucción utiliza
esa dirección para acceder a la ubicación de memoria.
Uso: Es común en situaciones de punteros o cuando se trabaja con estructuras de
datos dinámicas.
4. Traducción del programa de alto nivel (entrega 1) al lenguaje ensamblador que han
construido, usando su propio conjunto de instrucciones.
La resolución de este punto se trabajo de la siguiente manera, primero se tradujo el
pseudocódigo a lenguaje ensamblador, después este código se adapto a MIPS para poder
ser ejecutado en el simulador [Link] y así poder hacer pruebas y asegurarnos de que el
código funciona correctamente:
Pseudocódigo del ejercicio elegido en la entrega 1:
Imagen 2 – Ejemplo Pseudocódigo elegido a
solucionar
Traducción de código a lenguaje ensamblador:
A continuación, se presentara la tabla de las Instrucciones utilizadas
Instrucciones Utilizadas
Instrucción Significado Ejemplo Descripción
Leer un
Lee un valor del usuario y lo
IN número desde IN N1
guarda en el registro especificado.
entrada
Imprimir el
Muestra en pantalla el valor
OUT contenido de OUT N2
almacenado en el registro.
un registro
Imprimir texto Muestra en pantalla una cadena
PRINT PRINT "Texto"
literal de texto fija.
Compara dos registros. Afecta los
Comparar dos flags internos para instrucciones
CMP CMP N1, N2
registros de salto condicional como JGE, JE,
JNE.
Saltar si la
Salta a la etiqueta si el resultado
JE comparación JE etiqueta
anterior de CMP fue igual.
fue igual
Saltar si la
Salta si los valores comparados
JNE comparación JNE etiqueta
son distintos.
fue distinta
Saltar si el
Salta si el primer valor es mayor o
primer
JGE JGE etiqueta igual al segundo en la última
registro es
comparación.
mayor o igual
Salto Salta sin condición a una etiqueta
JMP JMP FIN
incondicional del programa.
Tabla 1 - Instrucciones Utilizadas
Implementación lenguaje ensamblador
; Leer los tres números
IN N1 ; Leer numero1
IN N2 ; Leer numero2
IN N3 ; Leer numero3
; Comparar si N1 == N2 Y también tenemos los registros
CMP N1, N2 utilizados, estos son los que van a
JNE MAYOR_CASO almacenar temporalmente los
numero s determinar cual es
; Comparar si N1 == N3 mayor
CMP N1, N3 Registros Usados
JNE MAYOR_CASO
Registro Significado Uso
Guarda el primer número
N1 si N2 == N3
; Comparar Número 1
ingresado.
CMP N2, N3 Guarda el segundo número
N2
JNE MAYOR_CASO Número 2
ingresado.
Guarda el tercer número
N3 son iguales Número 3
; Si todos ingresado.
PRINT "Los números son iguales." Tabla 2 - Registros Usados
JMP FIN
Después de determinar y
; Si no son iguales, determinar el mayor consultar cuales instrucciones
MAYOR_CASO: vamos a utilizar, se realiza la
implementación en lenguaje
; ¿N1 >= N2? ensamblador:
CMP N1, N2
JGE CMP_N1_N3
JMP CMP_N2_N3
CMP_N1_N3:
; ¿N1 >= N3?
CMP N1, N3
JGE IMPRIMIR_N1
JMP CMP_N2_N3
CMP_N2_N3:
; ¿N2 >= N3?
CMP N2, N3
JGE IMPRIMIR_N2
JMP IMPRIMIR_N3
IMPRIMIR_N1:
PRINT "El mayor número es: "
OUT N1
JMP FIN
IMPRIMIR_N2:
PRINT "El mayor número es: "
Implementación de código en MIPS en el simulador Mars:
A continuación, se mostrará en tabla las instrucciones y registros utilizados e imágenes del
código adaptado a MIPS para ser ejecutado en el simulador [Link]:
Instrucciones MIPS Utilizadas
Instrucció
Significado Ejemplo Uso en el programa
n
Load immediate (cargar Carga un número fijo (como un
li li $v0, 4
valor inmediato) código de syscall o constante)
Llamada al sistema Para leer, escribir, salir del
syscall syscall
(I/O, finalización, etc.) programa
Copia el valor de un Guarda el valor leído desde
move move $t0, $v0
registro a otro entrada
Branch if greater or bge $t0, $t1, Condición para saber cuál
bge
equal etiqueta número es mayor o igual
bne $t0, $t1, Condición para verificar si no
bne Branch if not equal
etiqueta son iguales
beq $t0, $t1, Condición para verificar si son
beq Branch if equal
etiqueta iguales
Jump (salto Saltar a una parte específica del
j j etiqueta
incondicional) código
Tabla 4 - Instrucciones MIPS Utilizadas
A continuación, se presentarán los registros:
Registros MIPS Utilizados
Nombre Uso específico en el
Registro
simbólico programa
Usado para: indicar syscall a
$v0 Value 0 ejecutar y recibir el valor
leído
Contiene el valor a imprimir
$a0 Argument 0 (cadena o número) en
llamadas syscall
Almacena el primer número
$t0 Temporary 0
(numero1)
Almacena el segundo
$t1 Temporary 1
número (numero2)
Almacena el tercer número
$t2 Temporary 2
(numero3)
Tabla 5 - Registros MIPS Utilizados
A continuación, se mostrará la interacción que se tiene sin syscalls:
Interacción con syscalls
Valor en $v0 Operación del syscall
1 Imprimir un entero
4 Imprimir una cadena
5 Leer un entero
10 Salir del programa
Tabla 6 - Interacción con syscalls
Ahora se enseñará el código implementado en el simulador Mars
Código MIPS
Imagen 3- Código MIPS Imagen 4 - Código MIPS
Imagen 5 - Código MIPS
Registros simulador
Imagen 6 - Registros simulador
Código ensamblado en el simulado para ser ejecutado
Imagen 7 - Código ensamblado
Resultados de pruebas realizadas
Imagen 7 - Resultados de pruebas realizadas
5. Listado en HEXA del binario que representa el programa realizado en el punto 4
de esta entrega.
La representación en lenguaje máquina de un programa ensamblador requiere definir una
estructura binaria para cada instrucción, la cual debe estar basada en el conjunto de
instrucciones personalizado desarrollado previamente. En este caso, cada instrucción se
codifica en 8 bits: los 4 bits más significativos representan el código de operación
(opcode), mientras que los 4 bits menos significativos indican el registro o parámetro
involucrado.
Cada instrucción se representa con un solo byte. Esta codificación uniforme simplifica la
implementación del decodificador y permite una lectura secuencial del programa en
memoria. A partir de esta estructura, es posible transformar directamente el código
ensamblador a una secuencia de valores binarios, y luego a su representación en notación
hexadecimal, la cual es más compacta y adecuada para la carga en memoria en
simuladores digitales como Logisim.
El programa construido recibe tres números del usuario, realiza comparaciones entre ellos
para determinar cuál es el mayor, y lo muestra en pantalla. La lógica del programa sigue
una estructura secuencial sin saltos ni ciclos, por lo que la conversión a lenguaje máquina
se puede hacer instrucción por instrucción en orden lineal.
Tabla de codificación de instrucciones
N Instrucción Opcode Registro/ Binario Hexade Descripción
Ensamblador (4 bits) Parámetro Completo cimal
(4 bits)
1 LEER R1 0001 0001 (R1) 00010001 11 Lee el valor
ingresado por el
usuario y lo
almacena en el
registro R1.
2 LEER R2 0001 0010 (R2) 00010010 12 Lee el segundo valor
ingresado por el
usuario y lo
almacena en R2.
3 LEER R3 0001 0011 (R3) 00010011 13 Lee el tercer valor y
lo guarda en el
registro R3.
4 MAYOR R1, 0111 0100 (R4) 01110100 74 Compara R1 y R2, y
R2 ->R4 almacena el mayor
de los dos en R4.
5 MAYOR R3, 0111 0101 (R5) 01110101 75 Compara R3 y R4, y
R4 ->R5 el mayor de ambos
se guarda en R5.
6 ESCRIBIR R5 0010 0101 (R5) 00100101 25 Muestra en pantalla
el contenido del
registro R5, que
contiene el número
mayor.
7 HALT 1111 0000 (sin 11110000 F0 Finaliza la ejecución
parámetro) del programa.
Descripción de cada instrucción ensamblador
LEER Rx: esta instrucción solicita al usuario la entrada de un valor numérico desde
el teclado y lo almacena en el registro Rx especificado. Se utiliza para capturar los
tres números que serán comparados.
MAYOR Rx, Ry → Rz: compara los valores almacenados en los registros Rx y Ry, y
almacena en el registro Rz el valor mayor entre los dos. Internamente, esta
instrucción ejecuta una operación condicional entre registros, que puede apoyarse
en una ALU con una unidad de comparación.
ESCRIBIR Rx: muestra en pantalla el valor almacenado en el registro Rx. Su objetivo
es comunicar el resultado final del cálculo al usuario a través del dispositivo de
salida.
HALT: detiene la ejecución del programa. Una vez alcanzada esta instrucción, el
procesador cesa todas las operaciones, indicando que el programa ha finalizado
correctamente.
Programa completo en hexadecimal
El programa traducido al formato hexadecimal es el siguiente:
Este conjunto de instrucciones representa:
11: leer el primer número del usuario y almacenarlo en R1.
12: leer el segundo número y guardarlo en R2.
13: leer el tercer número y almacenarlo en R3.
74: comparar R1 y R2, almacenar el mayor en R4.
75: comparar R3 y R4, almacenar el mayor en R5.
25: mostrar el contenido de R5 en pantalla.
F0: finalizar la ejecución del programa.
Cada uno de estos valores debe ser cargado secuencialmente en memoria, asignando una
dirección por byte. Esta secuencia hexadecimal puede ser utilizada directamente en un
bloque de ROM en Logisim, donde la dirección 0 contendrá el byte 11, la dirección 1 el
byte 12, y así sucesivamente hasta llegar al byte F0 en la dirección 6.
Organización de la memoria para carga en Logisim
Dirección (Decimal) Instrucción (HEX) Significado
0 11 LEER R1
1 12 LEER R2
2 13 LEER R3
3 74 MAYOR R1,R2 -> R4
4 75 MAYOR R3,R4 -> R5
5 25 ESCRIBIR R5
6 F0 HALT
En la memoria de instrucciones, estos valores deben estar organizados en el mismo orden,
iniciando desde la dirección 0 y ocupando una dirección por cada byte. Este orden
secuencial garantiza que el contador de programa (PC) recorra correctamente las
instrucciones durante la ejecución.
Importancia de la representación hexadecimal
La representación hexadecimal facilita la implementación y prueba del sistema, ya que
permite introducir los programas de forma compacta y legible. Además, es el formato más
utilizado para el diseño de microarquitecturas en simuladores y hardware digital. Esta
forma de representar el código resulta esencial para:
Cargar instrucciones directamente en memorias ROM o bloques de instrucción.
Depurar el sistema durante el desarrollo de la ALU.
Validar la ejecución correcta en entornos como Logisim.
Diseñar y verificar circuitos de control que interpreten los opcodes de cada
instrucción.
Esta codificación también permite vincular de forma directa el diseño lógico del
decodificador con la ejecución del programa, dado que cada opcode está asociado a un
comportamiento específico en la ALU.
El proceso de traducción de ensamblador a hexadecimal representa un paso esencial para
la conexión entre software y hardware. A través de esta transformación, el programa
adquiere una forma adecuada para ser ejecutada directamente por una unidad de control
en una arquitectura personalizada. Gracias al conjunto de instrucciones definido y a la
estandarización del formato, es posible implementar un flujo de ejecución robusto y
completamente funcional, que podrá ser simulado, analizado y validado en el entorno de
diseño lógico.