Pagina 1 di 1

informazioni sul salto incondizionato

MessaggioInviato: 30 ott 2014, 12:59
da mros
Buongiorno a tutti

E' corretto utilizzare un salto incondizionato (istruzione GOTO) durante l'esecuzione di un routine verso un punto del main principale?

esempio

Codice: Seleziona tutto
   
CICLOX9       
BTFSS   PORTB,4
    GOTO   CIC1
   
   CALL         XROUTINE

   BTFSC   PORTB,4
   GOTO   CIC2

   BSF   ERRORE,0
   GOTO   CIC3


.......
nella routine
Codice: Seleziona tutto
XROUTINE
   MOVF   VALORE,W   
   SUBLW   0      

   BTFSC   STATUS,2   
   GOTO   CICLOX9

Re: informazioni sul salto incondizionato

MessaggioInviato: 30 ott 2014, 13:10
da WALTERmwp
Ciao Foto Utentemros, non è ne corretto ne errato: è una possibilità.
Il fatto che sia opportuno o meno dipendo solo dall'esigenza applicativa: eseguire una istruzione piuttosto che un'altra.
Nella pratica l'indirizzo di memoria dal quale prelevare la successiva istruzione non sarà quello immediatamente seguente ma quello referenziato dalla label.
Questo vale sia che tu sia a livello principale piuttosto che all'interno di una funzione; in tale caso, però, non bisogna dimenticare che ci si è arrivati "caricando" lo stack.

Saluti

Re: informazioni sul salto incondizionato

MessaggioInviato: 30 ott 2014, 13:22
da GuidoB
Così come lo presenti direi che è sbagliato: una routine dovrebbe concludersi con una istruzione di ritorno (RET).
Col GOTO al posto del RET, la CALL continua a inserire l'indirizzo di ritorno sullo stack e nessuna RET lo toglie. Questo provoca stack overflow in un attimo.

Re: informazioni sul salto incondizionato

MessaggioInviato: 30 ott 2014, 15:09
da mros
cosa succede poi? ?%

Re: informazioni sul salto incondizionato

MessaggioInviato: 30 ott 2014, 16:23
da WALTERmwp
mros ha scritto:cosa succede poi?
... cose indicibili, pochi sono sopravvissuti per poterlo raccontare ...

Allora, continuando a richiamare funzioni tramite le CALL si verifica che, come ha scritto Foto UtenteGuidoB, saturi lo stack (riempi tutti i suoi livelli) e poi alla successiva scrittura (utilizzo della CALL) torni a scrivere sulla prima posizione dello stack stesso.
Ora, supponendo tu abbia uno stack di otto(8) posizioni, alla nona scrittura il "silicio" ti porterà a scrivere di nuovo sulla prima posizione dello stack (sovrascrittura circolare).
Il fatto è che non puoi tornare "indietro".
Significa quindi che se sei "sceso" di nove livelli non avrai più la facoltà di tornare al primo punto del programma (posizione del programma) dalla quale hai effettuato la prima CALL ( ... delle nove ipotizzate).
In questa situazione, continuando a richiamare il contenuto dello stack, ti trovi dinanzi a comportamenti più che imprevedibili, da parte del tuo codice; comportamenti che non sei in grado di spiegare se non ipotizzando una errata gestione dello stack ( ... prima però lo devi scoprire ...).
Ti suggerisco la lettura del datasheet del microcontrollore sul quale ti stai applicando.
Cerca "program memory" così da trovare i capitoli relativi alla organizzazione della memoria e la gestione del PC (Program Counter, ovvero il Contatore di Programma).

Saluti

Re: informazioni sul salto incondizionato

MessaggioInviato: 30 ott 2014, 17:00
da mros
Ok :ok:

P.S.
PIC16F677 con 8 livelli di stack