Register (cpu)

Et register er en særlig form for digital hukommelse knyttet til den centrale procesenhed, cpu'en, i en computer.

En cpu vil have et antal registre, hvor data, der arbejdes på aktuelt, kan opbevares. Et register er meget hurtigere for cpu'en at få fat i i forhold til maskinens hovedlager. Det vil derfor være en fordel at have adskillige registre i cpu'en, men på grund af den oprindeligt meget høje pris på elektronikken i et register, havde tidlige computere kun få registre. Mange registre gør det også nemmere for en oversætter at danne effektiv maskinkode.

Registrene i en cpu kan være generelt anvendelige (general purpose registers) eller specialiseret bestemte anvendelser. Nogle registre har flere anvendelser, men er stadig ikke generelt anvendelige. Tendensen går mod at øge antallet af generelt anvendelige registre, da det gør det lettere for en oversætter at finde et egnet, ledigt register, uden at skulle til at flytte indholdet først.

Registerlængde 
Længden på registrene i en cpu varierer for de forskellige maskiner. Nogle maskiner har en registerlængde på én byte (det var almindeligt for de små hjemmecomputere, der blev solgt fra 1970'erne. I modsætning til dette stod mainframes, der havde en ordlængde på adskillige bytes. Man har ligefrem forsøgt sig med en opdeling i byte-maskiner og ord-maskiner. Mikroprocessorer som Intel 8080 og Zilog Z80 havde begge en registerlængde på 8 bit, men nogle registre, der blev benyttet til adressering, var på 16 bit. Mainframes havde typisk en registerlængde på 32 bit, men var ofte også i stand til at adressere enkelte bytes inden for et ord. Mikroprocessorerne fik efterhånden registre på 16 bit og så 32 bit, hvor 64 bit i dag er ganske almindeligt. Bortset fra at adressere lageret, hvor det er komplekst at adressere et større lager, end man har adressebit til (se bank switching), så er der ikke nogen principiel forskel på, hvad en 8-bit maskine kan gøre i forhold til en med 64 bit store registre (givet tilstrækkelig tid, se Turing-komplet). Da det af og til kan være praktisk at kunne håndtere mindre størrelser end de fulde registre, kan mange computere også håndtere dele af registrene (byte, halv-ord).

Regneregister 
En cpu har (normalt) en eller flere regneregistre, der i dag ofte benævnes akkumulatorer. Her kan data, der skal regnes på eller som på anden måde skal gøres til genstand for behandling, anbringes. Her anbringes normalt også resultatet af en behandling. Ud over matematiske operationer (kompleksiteten af mulige operationer varierer fra cpu til cpu) kan data sammenlignes, der kan udføres logiske operationer (der ofte kan opfattes som aritmetiske operationer uden menteoverførsel). Data kan skiftes til højre eller venstre, lige som der kan roteres (den bit, der ryger ud i den ene side, føres ind på den tomme plads i den anden side). Resultatet af operationerne kan desuden påvirke forskellige flag, hvis f.eks. fortegnet bliver negativt eller der forsøgtes en division med nul (andre maskiner vil i stedet her udføre et trap eller interrupt). Sammenlignes to oplysninger, vil resultatet afspejles i bestemte flag, hvorimod selve dataene ikke ændres.

Flag eller statusord 
Processorens flag er ofte samlet i et flagregister eller et statusord (der er mange betegnelser) sammen med andre flag, der viser den tilstand, som maskinen aktuelt er i. Flagene kan benyttes til at afgøre, om et betinget hop skal udføres (f.eks.: hvis flaget for negative tal er sat, så hop til …).

Indeksregistre 
Et indeksregister er beregnet til at pege på an bestemt adresse i lageret, hvor der ligger (eller skal lægges) data. Man kan således hente indholdet af den adresse, som et bestemt indeksregister udpeger, og f.eks. lægge det til akkumulatoren. Enkelte maskiner har en indirekte-bit. Hvis den er sat i et ord (det være sig i et register eller i lageret), så vil maskinen, når dette ord læses, i stedet opfatte ordet som en adresse og hente sine data på den nye adresse. Der kan ofte udføres enkle matematiske operationer på indholdet af et indeksregister.

Stakken 
En stackpointer udpeger toppen af systemets aktuelle stak. Når der udføres en PUSH eller en POP, ændres stackpointeren tilsvarende.

Segmentregistre og virtuelt lager 
Et segmentregister og variationer over den samme ide benyttes til at modificere adresser i et kørende program. Et segmentregister peger på en adresse (evt. indeholder registret kun nogle af de mest betydende bit i en adresse). Når cpu'en f.eks. skal læse data fra en bestemt adresse, vil den adresse, der står i programmet, blive lagt til segmentregistret for datasegmentet (der kan være flere datasegmenter og datasegmentregistre), så man får en reel adresse. Meningen er, at når et program oversættes og linkes, så vil det eksekverbare program indeholde en lang række adresser på subrutiner og data. Disse adresser vil forudsætte, at programmet indlæses på en bestemt adresse i lageret for at adresserne skal passe. Dette kan ikke lade sig gøre på moderne computere, hvor andre programmer samtidigt optager plads i lageret, så programmet kan blive indlæst på en anden adresse end sidst. Ved at lade operativsystemet justere segmentregistrene, kan problemet let løses uden at skulle rette et hav af adresser i selve programmet. Ofte er der et par datasegmentregistre, et kodesegmentregister og et staksegmentregister.

Moderne processorer med virtuelt lager har betydeligt mere komplekse registre, der skal holde styr på, hvad der ligger hvor i lageret, hvad der er flyttet ud på disken og de dele af lageret, hvor indholdet er ændret (der er sat en dirty-bit for den pågældende del (side) af lageret). Maskinen vil også holde styr på, hvor tit de forskellige sider benyttes og hvornår det sidst er sket. Beskyttelse af sider, så der ikke kan skrives i kodesegmenter, og at andre programmer slet ikke kan se i data, der ikke vedkommer dem, håndteres også af dette komplekse system. Disse registre kan kun ændres af operativsystemet, de nødvendige instruktioner, privilegerede instruktioner, er forbudte for almindelige programmer. En væsentlig forskel i forhold til segmentregistre er, at at man med virtuelt lager kan komme ud for, at skulle adressere et større lager, end maskinen faktisk råder over. En adresse skal altså forandres til en helt anden adresse, måske i et mindre fysisk adresserum. Desuden vil en oversættelse af en adresse kunne variere fra gang til gang, efterhånden som siderne i det virtuelle lager skifter plads i det fysiske. Med et segmentregister benyttes en adresse inden for et større fysisk adresserum. Registre, der styrer et virtuelt lager, ligger i dag ofte på en særskilt enhed, en Memory management unit (MMU), men kan også findes på samme chip som mikroprocessoren.

Skjulte registre 
Ud over de registre, som kan benyttes af programmøren, vil en cpu have adskillige interne registre, der ikke eller kun delvist kan tilgås af programmøren. Det er sådanne registre som instruktionstælleren, forskellige statusregistre og mellemlagringsregistre, instruktionsregister og forskellige registre i instruktionsbehandlingen. De fleste af disse registre er kun tilgængelige fra maskinens mikroprogram (hvis maskinen benytter et mikroprogram). I andre tilfælde benyttes registre i en arkitektur, der reelt ikke findes. I stedet vil maskinens mikroprogram simulere dem ved at flytte data frem og tilbage mellem hovedlageret og de faktiske registre. Det tager længere tid, men har været benyttet til at skabe billigere computermodeller, der er kompatible med dyrere maskiner.

Registre i lageret 
På nogle maskinarkitekturer er maskinens registre også lagt ud som en del af maskines hovedlager. Dette er for eksempel tilfældet på UNIVAC 1100, hvor cpu'ens registre (som der ret usædvanligt for den tid er 128 af) ligger på de laveste adresser i lageret, andre maskiner har ikke rigtigt egne registre, som er tilgængelige for programmøren ud over den absolut nødvendige instruktionstæller og lidt til. I stedet arbejdes der, set fra programmørens side, direkte på adresser i maskinens lager. Dette er tilfældet på Texas Instruments TMS9900, en 16-bit mikroprocessor benyttet i TI99/4 mikrodatamaten.

Kilder og henvisninger 

 Structured Computer Organization, Andrew S. Tanenbaum, 1984
 Microcomputers/Microprocessors: Hardware, Software, and Applications, John L. Hilburn, Paul M. Julich, 1976

Computerhukommelse
CPU