Autor Tema: Mensaje de overflow "CALL"  (Leído 1479 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado kukkiv

  • PIC10
  • *
  • Mensajes: 10
Mensaje de overflow "CALL"
« en: 02 de Agosto de 2016, 13:21:24 »
Buenas tardes,

Presento el inconveniente a la hora de simular mi programa de Assembler en PROTEUS, por lo que no sé en donde localizar en mis líneas de código el "CALL" que me hace referencia mi simulador.

Esperando su pronta respuesta,

Gracias,
* OVERFLOW.txt
(8.73 kB - descargado 217 veces)
* OVERFLOW.txt
(8.73 kB - descargado 217 veces)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Mensaje de overflow "CALL"
« Respuesta #1 en: 02 de Agosto de 2016, 14:51:30 »
Normalmente es por problemas de programacion, Cada CALL deberia llegar a 1 RETURN, Si hay un CALL y existe la posibilidad de que NO llegue a un RETURN ocurre ese problema que comentas. Tenes que entender que los CALLs es poner una direccion en el stack, y el RETURN es quitarlo, El stack de los PICs es limitado.

Entonces apenas viendo el programa me encuentro con esto:

Código: ASM
  1. VERIFICAR
  2.     CALL TECLADO ; Rutina que me ubica el número de la matriz
  3.     CALL CONTADOR_1 ; Rutina que me cuenta el primer o segundo dígito para formar la letra
  4.  
  5. ;COORDENADAS DE LA MATRIZ - COMIENZO DE LA RUTINA DE MATRICIAL
  6. TECLADO
  7.     CLRF PORTB

Supongamos por el momento que los primeros CALL, es decir a Teeclado y contador_1 llegan a un RETURN y vuelven ( Es decir cancelarian esos 2 CALL - 2 ingresan, 2 egresan- ), Luego de volver del Contador_1 lo proximo a ejecutarse es el CLRF de Teclado, Si suponiamos que llegaba si o si a un RETURN la rutina Teclado , lo cual es obvio que esta vez NO posee un CALL. Y estamos en presencia de un "stack underflow", un problema que debe ser arreglado, distinto de seria esto:

Código: ASM
  1. [code=asm]VERIFICAR
  2.     CALL TECLADO ; Rutina que me ubica el número de la matriz
  3.     CALL CONTADOR_1 ; Rutina que me cuenta el primer o segundo dígito para formar la letra
  4.     GOTO VERFICAR
  5.  
  6. ;COORDENADAS DE LA MATRIZ - COMIENZO DE LA RUTINA DE MATRICIAL
  7. TECLADO
  8.     CLRF PORTB

Ese es uno de los problema con el stack que tenes.

--------------

Ahora suponiendo que esta arreglado el tema y es como lo puse al ultimo, es decir el loop principal ejecutaria esos CALL nomas y volveria hacerlo una y otra ves. Nos encontramos con el siguiente problema..

Contador_1 permite que siempre se ejecuten CALL pero nunca RETURN. Supongamos que se ejecuta la rutina Verificar, realiza el primer CALL y sale, Luego realiza el segundo CALL y va a CONTADOR_1, el codigo es el siguiente:

Código: ASM
  1. CONTADOR_1 ; Verifica cuántas teclas se han pulsado para arrojar la tecla
  2.     DECFSZ DOSDIG
  3.     GOTO DIG_1
  4.     GOTO DIG_2
  5.  
  6. DIG_1 ; Primer dígito me manda de nuevo
  7.     MOVF VALOR,W ; a la rutina del
  8.     MOVWF DIG1 ; matricial para
  9.     CLRF VALOR ; que busque el
  10.     GOTO VERIFICAR ; otro dígito


Suponete ahora que entra a DIG_1, se ejecutan todos las instrucciones y... tenes un GOTO VERIFICAR , es decir que no existio nunca un RETURN, por lo tanto ese CALL se queda sin RETURN, ahora si esto se ejecuta varias veces te encontras con un "stack overflow" Por que estas poniendo en el stack y nunca sacando.

----------------

Ahora veamos otro lugar donde hay problemas...

Código: ASM
  1. DIG_2 ; Ya se ingresó el segundo
  2.     MOVF VALOR,W ; dígito
  3.     MOVWF DIG2 ; preparo
  4.     CLRF VALOR ; para que
  5.     CALL SUMA_DIG ; me forme la suma de los dos dígitos, si es 40,41..., 50, 51... , 60, 61...
  6.     CALL BUSCAR_LETRA ; rutina que me ubica exactamente qué letra es con los dígitos que se ingresaron,
  7.     ;MOVLW 1                          ;en este ejemplo, la tabla se encuentra en la página 1.
  8.     ;MOVWF PCLATH           ;carga el número de página en PCLATH
  9.     CALL ASIG_LETRA ; ¡¡¡RUTINA CON PROBLEMAS!!!

En ves de ir a DIG_1 ahora vamos a DIG_2, el primer CALL ( SUMA_DIG) Posee RETURN si o si, por lo tanto es correcto, el Segundo CALL que es BUSCAR_LETRA miramos el codigo y:

Código: ASM
  1. BUSCAR_LETRA ;COMPARO BIT POR BIT EL NÚMERO FORMADO EN ASCII PARA QUE ME MANDE A LA LETRA QUE DESEO
  2.  
  3.     CLRF BUSCA
  4.     BTFSS RESULT,6
  5.     GOTO VERIFICAR

Observamos que puede existir la posibilidad que si el bit 6 de RESULT es 0 Vuelva a VERIFICAR, SIN usar un RETURN, y tendriamos otra posibilidad mas de stack overflow

-----------------------------

Respecto a como hiciste el tema de las letras, te aconsejo el uso de tablas, queda de forma mucho mas legible.
« Última modificación: 02 de Agosto de 2016, 14:56:49 por KILLERJC »

Desconectado kukkiv

  • PIC10
  • *
  • Mensajes: 10
Re:Mensaje de overflow "CALL"
« Respuesta #2 en: 02 de Agosto de 2016, 23:11:16 »
Pasando pena pues. GRACIAAAAAS, intentaré modificar todo eso, estaré avisando de cómo me fue.