Bitácora-C1-21/04/2015 (Rutinas)

Comenzamos con la entrega de parcialitos, repartiéndolos entre los compañeros para que cada uno corrija el de otro.
Resolvimos en grupo ejercicios:
    a) Pensar un programa que calcule: R6 = (95+R1)*18 + R1/(R2+256)
    b) Hacer un programa que calcule n^5 para los números en las celdas A001, A002 y A003 y lo guarde en la misma celda.
Notamos que el primer ejercicio lo podíamos ver como 2 cuentas que se resuelven por separado y luego se suman y el segundo ejercicio como una serie de instrucciones prácticamente idénticas que teníamos que realizar 3 veces (una vez para cada celda).
Entonces, cada una de estas tareas intermedias podemos considerarla una subrutina de nuestro programa.
De esta forma los ejercicios nos quedarían:
    a)
        MOV R3, R1
        ADD R3, 0x005F
        MUL R3, 0x0012
        MOV R4, 0x0100
        ADD R4, R2
        MOV R5, R1
        DIV R5 R4
        MOV R6, R3
        ADD R6, R5
b)
        MOV R1, [0xA001]
        MUL R1, [0xA001]
        MUL R1, [0xA001]
        MUL R1, [0xA001]
        MUL R1, [0xA001]
        MOV R1, [0xA002]
        MUL R1, [0xA002]
        MUL R1, [0xA002]
        MUL R1, [0xA002]
        MUL R1, [0xA002]
        MOV R1, [0xA003]
        MUL R1, [0xA003]
        MUL R1, [0xA003]
        MUL R1, [0xA003]
        MUL R1, [0xA003]
Al separar el programa en partes lo estamos modularizando.
Vemos que el ejercicio b) tiene mucho código repetido (o muy similar). Podemos crear una subrutina más genérica y reusarla para no tener que repetir instrucciones. Para hacerlo, le asignaremos una etiqueta y utilizaremos la noción de parámetros.
Entonces, podemos crear la (sub)rutina:
    elevarA5: MOV R0, R1
                    MUL R0, R1
                    MUL R0, R1
                    MUL R0, R1
                    MUL R0, R1
                    RET
 
Las rutinas etiquetadas deben finalizar con la instrucción RET.
Uso de rutina: Llamamos a una rutina por su etiqueta utilizando la instrucción CALL.
Entonces, el ejercicio b) nos quedaría:
    MOV R1, [0xA001]
    CALL elevarA5
    MOV [0xA001], R0
    MOV R1, [0xA002]
    CALL elevarA5
    MOV [0xA002], R0
    MOV R1, [0xA003]
    CALL elevarA5
    MOV [0xA003], R0
Para utilizar la rituna elevarA5 nos tuvimos que acordar cómo funcionaba o revisar el código para ver qué hacía, qué registros modificaba y dónde devolvía el resultado. De aquí surge la necesidad de documentar nuestro código (o sea, hacer aclaraciones sobre su funcionamiento).
Documentación / Contrato: Toda la información asociada a una rutina la documentamos. La separamos en los siguientes segmentos:
    Requiere: dónde se encuentran los parámetros, cómo y cuáles son       Modifica: Qué variables adicionales modifica
    Retorna: dónde se retorna el resultado
Vimos que también debíamos de especificar cuál es el propósito de nuestra rutina.
Sobre el final de la clase se trabajó con los ejercicios 8,9,11,12,13,14.
Atención con el ejercicio 13: Debemos saber si un número es par. Una forma de conseguir esto es viendo si el resto de la división por 2 es 0. Como no tenemos el operador que nos devuelva el resto, pueden utilizar una supuesta instrucción MOD para ello (que funcionaría como DIV pero devolviendo el resto en vez del cociente).
Luego, pueden crear ustedes mismos la rutina «resto» y cambiar el ejercicio anterior usando la misma.
Entonces, ¿cómo podríamos hacer un programa que calcule el resto? Para pensar. Están advertidos que no será tarea fácil.
Ayuda (Spoilers):
x = (x DIV y) * y + resto (donde DIV es el cociente de la división)
Más ayuda (Spoiler completo):
Si queremos saber el resto de 7 / 3, entonces debemos de calcular el resultado de la división entera de 7 / 3 (que es 2) y multiplicarlo con el divisor (que es 3). Entonces, nos queda 2 * 3 => 6. La diferencia entre este resultado y el dividendo (que es 7) es el resto. O sea, 7 – 6 => 1. Volver a leer la primera ayuda para terminar de entender todo el proceso.