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 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* centenas, decenas y unidades en tres posiciones de memoria
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:
muy bueno esto!
ResponderBorrarTal cual el gesto de mostaza jajaja!
ResponderBorrarEstuve media hora intentando hacer esto cuando la solucion era entrar y leer el blog... gracias
ResponderBorrar