Matías Vargas Telles y Azul López basado en trabajo previo de Carlos A. Di Pietro Organización del Computador I DC - UBA 2 do Cuatrimestre de 2013
Dónde estamos?
Arquitectura Orga1 Operaciones: Manejo de memoria: { MOV } Aritmético - Lógicas: { ADD, SUB, AND, OR, CMP, ADDC, NEG, NOT } Llamadas a función : { CALL, RET } Saltos:{Jxxx}
Se puede o no se puede? Si quiero realizar alguna operación que no está entre las anteriores, por ejemplo la división entera, Debo cambiar de arquitectura?
El ejercicio Enunciado: Escribir un programa que calcule la división entera entre dos enteros sin signo de 16 bits. R1 contiene la dirección de memoria donde se aloja el dividendo. R2 contiene la dirección de memoria donde se aloja el divisor. R3 debe ser el registro en el que se devuelva el cociente (el resultado de la división). En caso de que el divisor sea 0, habrá que devolver 0.
Pseudocódigo Para qué? Qué es el Pseudocódigo? Es una descripción informal de alto nivel de la lógica detrás de un algoritmo Ventajas: Abstracción. No pensar en 2 problemas a la vez. Claridad. Independencia del lenguanje. 1 pseudocódigo, n lenguajes. Flexibilidad. Licencia poética
Pseudocódigo del Ejercicio 1 resultado = 0 if (divisor == 0): listo else: while (dividendo >= divisor): dividendo = dividendo - divisor resultado = resultado + 1 listo
Resolución del Ejercicio 1 ; R1 --> puntero al dividendo ; R2 --> puntero al divisor ; R3 --> cociente ; R4 --> dividendo ; R5 --> divisor inicio: MOV R3, 0x0000 ; R3 = 0 MOV R4, [R1] ; R4 = dividendo MOV R5, [R2] ; R5 = divisor CMP R5, 0x0000 ; divisor == 0? JE fin ciclo: CMP R4, R5 ; dividendo < divisor? JCS fin ; uso JCS en lugar de JL porque ; son enteros sin signo SUB R4, R5 ; R4 = R4-R5 ADD R3, 0x0001 ; R3 = R3+1 JMP ciclo fin:
Ej 1 cont Puedo usar el código anterior para... saber si un número es divisible por 7? saber si un número es divisible por 3? saber si un número es divisible por 2? Para el último caso existe una forma mejor. Cuál? Tarea. TIP: Listar los primeros 5 pares y buscar coincidencias. Luego, pensar el algoritmo
Ejercicio 2 Enunciado: Dado un vector de enteros sin signo de 16 bits. calcular la suma de todos sus valores sabiendo que: R1 contiene la dirección en memoria del vector El valor de la sumatoria debe almacenarse en R2. El vector termina en 0x0000h Si la sumatoria pudo completarse con éxito se debe setear R3 en 1. Caso contario deberá indicarse que hubo un error colocando un 0 en dicho registro y devolver el valor anterior al error.
1er Paso: Pseudocódigo sumatoria = 0 i = 0 mientras (vector[i]!= 0): sumatoria = sumatoria + vector[i] i = i + 1 devolver sumatoria Not Impressed
1er Paso: Pseudocódigo 2.0 sumatoria = 0 i = 0 mientras (vector[i]!= 0 & sumatoria <= 0xFFFF): tmp = sumatoria sumatoria = sumatoria + vector[i] i = i + 1 if (sumatoria > 0xFFFF): devolver tmp else: devolver sumatoria Ahora sí!
Vectores en memoria Cómo se representa un vector en Orga1?
Ej. 2 cont. Qué devuelve el código anterior en el siguiente caso? < 0x0001, 0xFFFF, 0x00AA, 0x0BB0, 0xD00D > < 0x0001, 0xFF00, 0x00FF, 0x00A0, 0x000D, 0x0001, 0xFFFF, 0x00BB, 0x000A, 0x000D > Puedo hacer algo para salvar irregularidades de este tipo? TIP: Si tan solo pudiera evitar los casos malos...
Hoy Conocimos un poco más de Orga1. Programamos en su lenguaje. Comprendimos (ojalá) la importancia del pseudocódigo como paso previo a la implementación Para profundizar más sobre ASM de Orga1: Hacer los ejercicios de tarea (Ver paridad sin algoritmo división, arreglar la sumatoria y suma de matrices) Hacer la práctica ad hoc. Consultar a los docentes.
Gracias, vuelva prontos