Goto och call problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Markus
Inlägg: 105
Blev medlem: 4 november 2005, 02:35:06
Kontakt:

Goto och call problem

Inlägg av Markus »

Hej på er. Jag andvänder pic16f84 när jag programmerar.

min fråga är vad skinlladen mellan call och goto. Dom fungerar precis på samma sätt. Vilken av dessa skla man andvända instruktionen return till.

Det är nämerligen såhär att jag fått problem med stacken när jag kör programmet.

TEX

delay:
nop
return



main:
loop:
call delay
call loop

end


då får jag feletatt stacken är full. om jag andvänder goto i stället för goto lopp i stället för call loop så fungerar programmet som det ska.

Jag funderar på om det kan vara någotmed återhoppningsadressen som inte tas bort från stavkennär man andvänder call utan return värde.

bifråga till detta blir också när ser manskinllad när man ska andvända call ochinte goto. Alltså hur ser man skinllad på en ettiket och en subrutin.en subrutin skapar du med hjälp av en ettikett.som ex ovan delay.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Grabben...ta't lugnt när du skriver.....dina fingrar snubblar ju över varandra...

call används dår man vill återgå till stället där man utförda call'et.

Goto används där man väljer väg.

I ditt fall ska du alltså skriva:
call delay ; utför "delay" grejen som om att den var skrivit här
goto loop ; Byter till vad som ska göras härnäst.

Att börja tjata om att 16F84 är uråldrig ids jag inte men ska du designa något nytt bör du välja en annan.

Man använder call när man vill utföra en funktion som utförs många ställen men man inte ids skriva om och om igen. Ett call ska såklart alltid avslutas med return.

Goto betyder helt enkelt att nu ska jag dit och köra, jag är färdig här.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Ja, kort och gott:
call anropar subrutin (och sparar återhoppsadress i stacken)
goto anropar vanliga rutiner, utan återhoppsadress

Markus, läs på om vad som är speciellt med en subrutin.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Jag andvänder pic16f84 när jag programmerar.

Donera den till något elektronikmuseum och skaffa en modern processor.

> vad skinlladen mellan call och goto. Dom fungerar precis på samma sätt.

Gör dom ? Inte enligt beskrivningen i databladet.

Enda skillnaden på CALL och GOTO är igentligen att CALL sparar under ett "bokmärke" på stacken som talar om vilken adress instruktionen *efter* CALL instruktionen har. RETURN sedan kan plocka tillbaka detta "bokmärke" och återställa programräknaren så att programmet fortsätter efter CALL instruktionen.

Både CALL och GOTO laddar programräknaren med adressen som motsvaras av den "label" som man har angivit i instruktionen (men se upp med PCLATH på PIC16 processorer med mer än 2 Kword programminne !)

> Alltså hur ser man skinllad på en ettiket och en subrutin.

Frågan är inte rellevant. En label är ingenting annat än en symbol som innehåller en adress i programminnet, och har ingeting med subrutiner i sig att göra. Inte mer än att man använder en label för att markera var man vill att subrutinen skall starta. Dessutom kan man mycket väl ha flera "entry points" (alltså markerade med flera olika labels) i en subrutin med en gemensam RETURN på slutet.

CALL måste alltså alltid hänga ihop med RETURN
CALL "anropar" en subrutin.
GOTO hoppar bara någonstans, den "anropar" ingenting.
Markus
Inlägg: 105
Blev medlem: 4 november 2005, 02:35:06
Kontakt:

Ok,men jag fattar inte ändå

Inlägg av Markus »

är subrutinen jag gjorde i mitt exempel en subrutin. Alltså delay.

Jag anropar ju delay heller hur med call och sedan returnera tillbaka där jag callade på subrutinen med return.Så jag hoppar ju i programkoden till ett annat ställe. Det samma gör jag med goto. bäge två lagrar returvärdet i stackregistret
Så jag ser ingenskinllad.kan någon förklara noggrannare ser ingen skinllad mellan dessa instruktioner. När ska jag andvända när.

Var kan jag se stackregistret i Mplab 7.2. vart går jag in för att se vilket värde som ligger där.Är det bara returvärden från goto, och call som hamnar där eller.

.
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

som sagt, när du anropar båda dina labels med call kommer stacken att växa tills den blir full pga att du inte använder return när du kört 'call loop'. Då lagras nämligen data på stacken men tas aldrig därifrån.
ClasseMan
Inlägg: 176
Blev medlem: 9 juli 2004, 15:21:02
Ort: Karlskrona
Kontakt:

Inlägg av ClasseMan »

> bäge två lagrar returvärdet i stackregistret

Nej goto lagrar inget i stacken om du anropar delay rutinen i ditt exempel med goto har du ingen aning vad programräknaren hamnar efter return.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> är subrutinen jag gjorde i mitt exempel en subrutin. Alltså delay.

Saknas det inte ett frågetecken där ?

En kodsnutt som anropas med CALL och som avslutas med RETURN kan kallas för en "subrutin", visst. Men PICen i sig vet inget om det.

> Jag anropar ju delay heller hur med call och sedan returnera tillbaka där jag callade på subrutinen med return.

Yes.

> Så jag hoppar ju i programkoden till ett annat ställe.

Du kan kalla det så, om du vill.

> Det samma gör jag med goto. bäge två lagrar returvärdet i stackregistret

**LÄS** mitt tidigare inlägg först...

> Var kan jag se stackregistret i Mplab 7.2.

Det har du inget behov av.
Skriv svar