Sida 1 av 1

Goto och call problem

Postat: 8 november 2005, 16:29:23
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.

Postat: 8 november 2005, 17:04:12
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.

Postat: 8 november 2005, 17:16:47
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.

Postat: 8 november 2005, 17:58:04
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.

Ok,men jag fattar inte ändå

Postat: 8 november 2005, 21:23:06
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.

.

Postat: 8 november 2005, 21:30:10
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.

Postat: 8 november 2005, 21:36:00
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.

Postat: 8 november 2005, 22:10:33
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.