Programräknare - Program counter
Den programräknaren ( PC ), vanligen kallad instruktionspekaren ( IP ) i Intel x86 och Itanium mikroprocessorer , och kallas ibland instruktionsadressregistret ( IAR ), i instruktionsräknaren , eller bara en del av instruktions sequencer, är en processor register som indikerar var en dator är i sin programsekvens .
Vanligtvis ökas PC: n efter att ha hämtat en instruktion och har minnesadressen för (" pekar på") nästa instruktion som skulle utföras.
Processorer hämtar vanligtvis instruktioner sekventiellt från minnet, men kontrollöverföringsinstruktioner ändrar sekvensen genom att placera ett nytt värde i datorn. Dessa inkluderar grenar (ibland kallade hopp), subrutinanrop och retur . En överföring som är villkorad av sanningen om något påstående låter datorn följa en annan sekvens under olika förhållanden.
En gren föreskriver att nästa instruktion hämtas från någon annanstans i minnet. Ett underrutinanrop förgrenar inte bara det föregående innehållet på datorn någonstans. En retur hämtar det sparade innehållet på PC: n och placerar det tillbaka i PC: n, och återupptar sekventiell körning med instruktionen efter subrutinanropet.
Hårdvaruimplementering
I en enkel centralenhet (CPU), är datorn en digital räknare (som är ursprunget till termen "programräknaren") som kan vara en av flera hårdvaruregistren . Den instruktionscykeln börjar med en fetch , där processorn sätter värdet på datorn på adressbussen för att skicka den till minnet. Minnet svarar genom att skicka innehållet på minnesplatsen på databussen . (Detta är den lagrade programmets datormodell , där ett enda minnesutrymme innehåller både körbara instruktioner och vanliga data.) Efter hämtningen fortsätter CPU: n till körning och vidtar några åtgärder baserat på det minnesinnehåll som den erhållit. Vid någon tidpunkt i denna cykel kommer PC: n att modifieras så att nästa instruktion som utförs är en annan (typiskt, ökad så att nästa instruktion är den som börjar vid minnesadressen omedelbart efter den sista minnesplatsen för den aktuella instruktionen) .
Liksom andra processorregister kan datorn vara en bank med binära spärrar, var och en representerar en bit av datorns värde. Antalet bitar (datorns bredd) avser processorarkitekturen. Till exempel kan en "32-bitars" CPU använda 32 bitar för att kunna adressera 2 32 enheter minne. På vissa processorer beror bredden på programräknaren istället på det adresserbara minnet. till exempel har vissa AVR-kontroller en dator som slingrar sig efter 12 bitar.
Om PC: n är en binär räknare kan den öka när en puls appliceras på dess COUNT UP-ingång, eller så kan CPU beräkna något annat värde och ladda det in i PC: n med en puls till dess LOAD-ingång.
För att identifiera den aktuella instruktionen kan PC: n kombineras med andra register som identifierar ett segment eller en sida . Detta tillvägagångssätt tillåter en PC med färre bitar genom att anta att de flesta minnesenheter av intresse ligger inom den aktuella närheten.
Konsekvenser i maskinarkitektur
Användning av en dator som normalt ökar förutsätter att det som en dator gör är att utföra en vanligtvis linjär instruktionssekvens. En sådan dator är central för von Neumann-arkitekturen . Således skriver programmerare ett sekventiellt kontrollflöde även för algoritmer som inte behöver vara sekventiella. Den resulterande " von Neumann-flaskhalsen " ledde till forskning om parallell beräkning, inklusive icke-von Neumann- eller dataflödesmodeller som inte använde en PC; till exempel, snarare än att specificera sekventiella steg, kan högnivåprogrammeraren specificera önskad funktion och lågnivåprogrammeraren kan specificera detta med hjälp av kombinationslogik .
Denna forskning ledde också till sätt att få konventionella, PC-baserade processorer att gå snabbare, inklusive:
- Rörledning , där olika hårdvaror i CPU: n kör olika faser av flera instruktioner samtidigt.
- Den väldigt långa instruktionsordarkitekturen (VLIW), där en enda instruktion kan uppnå flera effekter.
- Tekniker för att förutsäga körning utan ordning och förbereda efterföljande instruktioner för körning utanför den ordinarie sekvensen.
Konsekvenser i programmering på hög nivå
Moderna programmeringsspråk på hög nivå följer fortfarande den sekventiella exekveringsmodellen, och faktiskt är ett vanligt sätt att identifiera programmeringsfel med ett "procedurutförande" där programmerarens finger identifierar exekveringspunkten som en PC skulle göra. Språket på hög nivå är i huvudsak maskinspråket för en virtuell maskin, för komplext för att byggas som hårdvara men istället emuleras eller tolkas av programvara.
Nya programmeringsmodeller överskrider dock programmering med sekventiell körning:
- När man skriver ett program med flera trådar kan programmeraren skriva varje tråd som en sekvens av instruktioner utan att specificera tidpunkten för någon instruktion i förhållande till instruktioner i andra trådar.
- I händelsestyrd programmering kan programmeraren skriva instruktioner för att svara på händelser utan att ange en övergripande sekvens för programmet.
- I dataflödesprogrammerings kan programmeraren skriver varje sektion av en dator rörledning utan att specificera timingen i förhållande till andra sektioner.
Symbol
Leverantörer använder olika tecken för att symbolisera programräknaren i monteringsspråkprogram . Medan användningen av en "$" -tecken förekommer i Intel , Zilog , Texas Instruments , Toshiba , NEC , Siemens och AMD- processorns dokumentation, använder Motorola , Rockwell Semiconductor , Microchip Technology och Hitachi istället en "*" karaktär, medan SGS-Thomson Mikroelektronik använder "PC".
Se även
- Gren förutsägelse
- Instruktionscache
- Instruktionscykel
- Instruktionsenhet
- Instruktionsrörledning
- Instruktionsregister
- Instruktionsplanering
- Programstatusord