Goto och call problem
Goto och call problem
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.
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.
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.
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.
> 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.
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å
ä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.
.
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.
.
> ä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.
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.