lunes, 16 de mayo de 2016

Simulando programas: ejecución a lo mostaza (paso a paso)

Más de una vez alguien que entendía mucho más que uno nos muestra su programa (el código fuente) diciendo"bla, bla, bla, funciona perfecto, bla, bla", y ante la avalancha de conceptos nos quedamos... 

 

El gran problema es que aun cuando lo ejecutamos -o simulamos- las cosas pasan tan rápido que seguimos igual de perdidos que al principio. Algo parecido ocurre cuando creemos haber resuelto un ejercicio, lo ejecutamos... y nos llevamos la decepción de ver que no hace lo que queríamos. ¿Qué herramienta tenemos para paliar estas situaciones? La ejecución paso a paso. En el simulador THRsim podemos lograrlo de dos maneras:
La primera sería estableciendo puntos de interrupción (breakpoints) en el programa. Para ello cargamos el archivo del código fuente (o guardamos lo que hayamos hecho) y vamos al menú Breakpoint -> Set...


La ventana de diálogo que se presenta  nos permitirá indicar en qué punto del programa debe interrumpirse la ejecución. 


Atención! Si le indicamos que interrumpa la ejecución en la primer instrucción, no lo hará. En realidad lo tomará como que ya había sido interumpida... así que para que funcione debemos indicar una dirección del PC distinta de la inicial. En el ejemplo el programa inicia en el ORG $C000, por tanto fijaremos un breakpoint en la siguiente instrucción: $C003. Para determinar dónde queremos frenarlo, podemos guiarnos por el ensamblado, al que accedemos con menú File->Assemble (partiendo de la ventana del código fuente). En el ejercicio que voy a usar como ejemplo la ventana de ensamblado se ve así:


El programa que presento como ejemplo informa las unidades, decenas y centenas de un número entero sin signo de ocho bits. Fijé un breakpoint en PC==$C003. Luego iniciamos la ejecución como lo hacemos normalmente (menú Execute -> Run...) y frena en el punto que se muestra en la captura anterior. Notar que en rojo señala el punto en el que frenó la ejecución. En este punto podemos continuar la ejecución hasta el siguiente breakpoint, o ir "paso a paso" con menú Execute->Step (o usando la barra espaceadora o F7). Veamos cómo sería el paso a paso...

 
Ahora es más sencillo comprender el algoritmo empleado, verificando pacientemente una y otra vez el programa. En el ejemplo el número a desglosar es 123 (en hexadecimal 7B). 

La segunda es: ensamblar el programa (con el menú File -> Assemble o con la hot key Ctrl+A) y luego desde esa ventana usar la tecla F7 para ejecutar paso a paso. Si el programa es relativamente corto, este método es más conveniente.

Es posible crear puntos de interrupción para condiciones respecto a acumuladores, registros índice, y posiciones de memoria, entre otros.  
A propósito el fuente que usé es el siguiente:

* Dado un numero entero sin signo de 8 bits, informar:
* centenas, decenas y unidades en tres posiciones de memoria
         ORG    $0000
num    RMB    1    * el mister en cuestion
cen    RMB    1   
dec    RMB    1   
uni    RMB    1   

       ORG    $C000
       CLR    cen    * arranco poniendo todo en cero
       CLR    dec    * porque voy a incrementar cada uno
       LDAA   num
rec    SUBA   #100   * intento restarle 100...
       BLO    mpc    * si me pase, no hay mas centenas
       INC    cen    * sino, es que habia alguna centena mas
       BRA    rec
mpc    ADDA   #100   * como me pase, le vuelvo a sumar 100
red    SUBA   #10    * intento restarle 10...
       BLO    mpd    * si me pase, no hay mas decenas
       INC    dec    * sino, es que habia alguna decena mas
       BRA    red
mpd    ADDA   #10    * recupero los ultimos 10 que le reste
       STAA   uni    * quedaron las unidades
fin    BRA    fin


Me despido con el recuerdo del gran Mostaza... tipo sufrido si los hay (para dirigir Racing hay que ser sufrido)... en un gesto propio de alumno que ve cómo se hacia un ejercicio en la clase posterior al examen:

3 comentarios:

  1. Tal cual el gesto de mostaza jajaja!

    ResponderBorrar
  2. Estuve media hora intentando hacer esto cuando la solucion era entrar y leer el blog... gracias

    ResponderBorrar

Aunque no es obligatorio, es de buena educación firmar los comentarios.