View Single Post
Ok, er nå hjemme igjen fra forelesning og skal prøve å gi en enkel introduksjon til hvordan dette henger sammen - og hvordan en prosessor klarer å faktisk utføre kommandoer som du har skrevet i tekst. Jeg til ta for meg instruksjonsettet til MIPS her som et eksempel.

Jeg vil kun ta en enkel introduksjon her, og henviser deg til boka vi hadde som pensum forrige semester om du vil ha en mer dyptgående forståelse. Denne boken syntes i hvertfall jeg var veldig god. "Computer Organization and design - The Hardware / Software interface" Av David A Petterson

Hvordan er en (mikro)prosessor bygget opp?`
En prosessor består i hovedsak av følgende enheter:
  • Instruksjonsminne - Dette er et lite minne hvor alle instruksjonen til programmet blir lastet inn. Disse ligger i sekvensiell rekkefølge, slik at den begynner på toppen og blar seg gjennom instruksjonene.
  • Dataminne - Et minne hvor alle variabler lagres, kan være samme minne som instruksjonsminne, bare med annet interface.
  • Register - Om du er kjent med assembly så har du vært borti registere, de lagres i hvertfall her. Og er et lite utvalg av små variabler som man kan lagre for å raskt skrive og lese verdier som ikke trengs å lagres i minne.
  • Kontrollenhet - Enheten som styrer hvordan prosessoren behandler de ulike instruksjonen. F.eks. bestemmer den om ALU skal gjøre en addisjon eller subtraksjon.
  • ALU - En aritmetisk-logisk enhet. Enheten i maskinen som kan ta for seg enkle logiske operasjoner som ADD, SUB, OR, AND og XOR, med hensyn til 2 inputs og et kontrollsignal.
  • +++ en del andre små logiske enheter som jeg ikke vil ta for meg

Maskinkode, hva er det?
Maskinkode er kommandoer som er skrevet i binær, hvor hver enkel "binær-streng" er en enkel kommando. I MIPS er hver binær-streng 32 bits. Denne maskinkoden kan man skrive selv om man ønsker det, men det er ikke anbefalt; da debugging av maskinkode er utrolig tungvindt. Er derfor mer anbefalt å enten skrive assembly eller C og bruke en kompilator som gjør om koden til maskinkode for deg.

I MIPS har man i hovedsak 3 forskjellige typer instruksjoner, som brukes i ulike tilfeller - og er bygget opp på ulike måter, men alle 3 typene har en likhet med at de første 6-bitsene i strengene er et OP-felt som leses av kontrollenheten, som beskriver hva slaks type instruksjon dette er. På denne måten kan kontrollenheten sette riktige kontrollsignaler til de andre enhetene. (f.eks. om det skal skrives til register, om ALU skal brukes o.s.v.

- R-Type instruksjoner:
Dette er instruksjoner hvor det skal utføres en logisk operasjon på 2 registere.
"add t3,t2,t1" dette er et eksempel på en R-type instruksjon.
En R-type instruksjon er bygget opp på følgende måte:
OP (6) - rs (5) - rt (5) - rd (5) - shamt (5) - funct (6)
Hvor hvert tall representerer hvor mange bits hver felt er på.
OP-feltet har vi allerede snakket opp. RS og RT er her bitsene som representerer adressen til de 2 registeradressene prosessoren skal lese fra. Om man tar for seg assemblykoden over vil dette være henholdsvis register t1 og t2.

RD-felter er adressen til registeret hvor svaret på en eventuell logisk operasjon skal lagres. I vårt tilfelle blir dette register t3.

Funct-feltet er det som sendes til alu-kontrollen, og sier kort og enkelt om aluen skal gjøre en ADD, SUB... (osv).

Jeg velger å ikke ta for meg I-type og J-type instruksjoner, men de er relativt enkle. Du kan lese mer om de om du ønsker.

Hvordan henger alt sammen?
Det hele begynner med at den leser første intruksjon fra minnet, vi anntar den leser følgende instruksjon:
add t2,t2,t1 (Binært: 000000 01010 01001 01010 00000 100000)

Kontrollenheten leser de første 6 bitsene (OP-koden) og ser at dette er en R-type instruksjon. Den setter derfor kontrollsignaler som sier følgende:
- Ikke lese til minne
- Ikke skrive til minne
- Skal lese fra register
- Skal skrive til register
- ALU skal gjøre utregning
(igjen husk at alt er forenklet)

Registeret leser så ut verdiene fra register t1(=01001) og t2(=01010), og sender disse til ALUen.

Kontrolleren til ALU-en leser så func-feltet til den binære kommandoen (som her er 100000) og forstår at dette er en ADD-instruksjon. Den ser og at den har fått beskjed av kontrollenheten til prosessoren at den skal gjøre en utregning, og gjør derfor denne addisjonen og sender svaret tilbake til registeret.

Registeret vil så lagre verdien fra denne utreningen i register t2 (=01010, som er adressen den hentet fra RD-feltet)

Neste instruksjon blir så lastet fra instruksjonsminne, og utført på samme måte.

Dette var veldig kort, og veldig forenklet forklaring. Håper du forstår noe mer enn før i hvertfall. Men vil anbefale deg å ta å lese boken jeg anbefalte, da spørsmålet ditt i hovedsak er besvart med cirka 600 sider i den boken; så blir litt vanskelig å korte det ned til en post på et forum.


Her er et forenklet bilde av hvordan en MIPS-prosessor er bygs opp, kanskje det er til hjelp: Her er det noen deler jeg ikke har tatt for meg, som f.eks. de enhetene øverst på bilde, og PC (program counter). Dette er enhetene som tar seg av hvilken adresse neste instruksjon ligger på. Det er og llagt inn støtte for branching (typisk til løkker)
http://inst.eecs.berkeley.edu/~cs61cl/fa07/diagrams/5.17.png

Du spør spesifikt om hvordan den hånderer if og while løkker, for å forklare dette er det greit å kunne litt assembly, slik at man vet hvordan dette håndteres der med hensyn til "Branching".

En instruksjon som brukes i assembly er i hvertfall bne (branch, if not equal) og be (branch if equal), hvor den sammenligner 2 registere og hopper til en adresse hvis verdien i disse er like.

Dette er da en I-type instruksjon, som er bygget opp på følgende måte:

OP(6 bits), RS(5 bits), RT(5 bits), immidiate(16 bits)

Her sier OP-koden at dette er en I-type branch operasjon. Prosessoren vil da laste inn verdiene i register RS og RT og sammenligne disse. Dette gjøres ved at verdiene RS og RT sendes til ALU-en som gjør en subtraksjon av disse, og ser om svaret fra substraksjonen er 0. Om svaret er 0 (eller ikke 0, om man bruker "BNE") vil den normale programmteleren (som styrer hvilken instruksjon som er den neste til å utføres) overstyres, og den vil i stede lese instruksjonen som ligger i adressen som immediate-feltet i binær koden peker til.

Om noe er uklart, eller noe du vil ha forklart bedre er det bare å spørre.