Hvordan en prosessor arbeider, del 1

Like dokumenter
Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

Prosessoren. Bakgrunnen Innhold LMC. Assemblerkode Oppsummering instruksjonene [Englander kap 6] Hva inneholder den? Hvordan utføres instruksjonene?

Oppbygningen av en datamaskin Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

Pensum Hovedtanker Selvmodifiserende Overflyt Veien videre Eksamen. Oppsummering

En oppsummering (og litt som står igjen)

Forhistorien Menneskene har alltid prøvd å lage maskiner for å løse sine problemer. Dagens tema INF1070 INF1070 INF1070

Den siste dagen. Pensumoversikt Hovedtanker i kurset Selvmodifiserende kode Overflyt Veien videre... Eksamen

Datamaskinenes historie Når, hvor og hvorfor ble de første datamaskiner laget? Hvordan har utviklingen gått? Hva inneholder en datamaskin?

Oppsummering Assemblerkode Hopp Multiplikasjon Kode og data Array Oppsummering

Forhistorien Menneskene har alltid prøvd å lage maskiner for å løse sine problemer. Dagens tema

Datamaskinenes historie Når, hvor og hvorfor ble de første datamaskiner laget? Hvordan har utviklingen gått? Hva inneholder en datamaskin?

Dagens tema: Enda mer MIPS maskinkode

Programmeringsspråket C

Del 1 En oversikt over C-programmering

Kapittel 1 En oversikt over C-språket

Informasjon Prøveeksamen IN1020 høsten 2017

Velkommen. Velkommen til INF2270. Datamaskinarkitektur. Motto: Datamaskinen på tvers

Læringsmål og pensum. v=nkiu9yen5nc

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 1 Introduksjon til Programmering og Python. Professor Alf Inge Wang

INF2270 Datamaskinarkitektur

INF2270 Datamaskinarkitektur

Dagens tema INF2270. Cs preprosessor. Separat kompilering av C funksjoner. C og minnet. Dag Langmyhr,Ifi,UiO: Forelesning 5. februar 2007 Ark 1 av 15

Programmeringsspråket C

Programmeringsspråket C Del 2

Programmeringsspråket C

Programmeringsspråket C Del 2

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Programmeringsspråket C Del 2

Debugging. Tore Berg Hansen, TISIP

Dagens tema INF1070. Makroer. Sanntidsprogrammering. Avbrudd. Bruker- og supermodus. Blanding av C og assemblerkode. Selvmodifiserende kode

Dagens tema: Maskinkode. Litt datamaskinhistorie Hva er maskin- og assemblerkode? x86-prosessoren Programkode og variabler

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

Dagens tema. Rask-maskinen. Rasko-kode Raskas-kode. Litt datamaskinhistorie Registre og lagre Instruksjoner

En overikt. Dagens tema. Datamaskinenes historie. Rask-maskinen Litt datamaskinhistorie Registre og lagre Instruksjoner. Rasko-kode.

Tema for siste forelesning:

Eksamensinformasjon. Prosesser. Prosesser. Eksamensoppgave. Operativsystemer (DATS/ITPE2500) Bokmål 06. juni 2017 kl

Velkommen til INF2100 Jeg er Dag Langmyhr

Dagens tema. Datamaskinenes historie. De første moderne datamaskiner. Løsning. Menneskene har alltid prøvd å lage maskiner for å løse sine problemer.

Generell informasjon

UNIVERSITETET I OSLO

Del 4 Noen spesielle C-elementer

Innhold. 2 Kompilatorer. 3 Datamaskiner og tallsystemer. 4 Oppsummering. 1 Skjerm (monitor) 2 Hovedkort (motherboard) 3 Prosessor (CPU)

Dagens tema. Makroer Ofte gjentar man kodelinjer når man skriver assemblerkode. Da kan det lønne seg å definere en makro:

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

TDT4105 Informasjonsteknologi, grunnkurs (ITGK)

UNIVERSITETET I OSLO

Programmeringsspråket C Del 2. Michael Welzl

Dagens tema INF1070. Vektorer (array er) Tekster (string er) Adresser og pekere. Dynamisk allokering

En oppsummering. Pensumoversikt Hovedtanker i kurset Selvmodifiserende kode Overflyt Eksamen. Programmeringsoppgaver Flervalgsoppgaver

Oppgave 1 - Linux kommandolinje (%)

IN 147 Program og maskinvare

Vektorer. Dagens tema. Deklarasjon. Bruk

UNIVERSITETET I OSLO

Bakgrunnen for INF2100. Velkommen til INF2100. Prosjektet. Hva gjør en kompilator?

INF2270 Datamaskinarkitektur

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

IN 147 Program og maskinvare

Velkommen til INF2100

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Dagens tema. Mer MIPS maskinkode. Maske-operasjoner Skift-operasjoner Lesing og skriving Pseudo-instruksjoner Mer om funksjonskall Registeroversikt

Seksjon 1. INF2270-V16 Forside. Eksamen INF2270. Dato 1. juni 2016 Tid Alle trykte og skrevne hjelpemidler, og en kalkulator, er tillatt.

Dagens tema INF1070. Bit fikling. Makroer. Blanding av C og assemblerkode. Mer om Core War. Dag Langmyhr,Ifi,UiO: Forelesning 22. mai 2006 Ark 1 av 25

TDT4110 Informasjonsteknologi, grunnkurs Uke 35 Introduksjon til programmering i Python

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

Cs preprosessor. Dagens tema. Betinget kompilering

Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen

Tema for siste forelesning:

IN 147 Program og maskinvare

Oversikt. INF1000 Uke 2. Repetisjon - Program. Repetisjon - Introduksjon

Velkommen til INF Introduksjon til operativsystemer og datakommunikasjon

TDT4160 Datamaskiner Grunnkurs Gunnar Tufte

Eksamen INF2270 våren 2018

Kjøresystemer. Hva er et kjøresystem? Den abstrakte maskinen SIMPLESEM (2.6) Klassifisering av språk: Parametre (2.7.7) Statiske språk (

UNIVERSITETET I OSLO

Oppgavene 1, 2, 4, 5, 6, 9, 12 og 13 passer best til å løses ved en datamaskin.

TDT4105 Informasjonsteknologi, grunnkurs (ITGK)

INF-103. Velkommen til. Første time. Fra brukergrensesnitt til maskinvare. eller Datamaskinen på tvers. Andre time

Dagens program. Operativsystemer Prosesser og systemkall i UNIX Hente prosessens nummer Starte prosesser Vente på prosesser Utføre programmer

INF-103 Fra brukergrensesnitt til maskinvare

Dagens tema. Cs preprosessor Separat kompilering av C-funksjoner C og minnet Oversikt over operatorene

TDT4110 IT Grunnkurs Høst 2015

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Velkommen til INF1060. Introduksjon til operativsystemer og datakommunikasjon

Dagens tema. Er maskinen big endian? Denne funksjonen tester det: INF1070 INF1070 INF1070 INF1070

UNIVERSITETET I OSLO

Kapittel 1: Datamaskiner og programmeringsspråk

Intro Rask kode x86-op Optimalisering Inline-kode Konklusjon

Datamaskinen LC-2. Dagens tema. Tall i datamaskiner Hvorfor kan LC-2 lagre tall i intervallet ? Hvorfor er det akkurat celler i lageret?

Dagens tema. Datamaskinen LC-2 En kort repetisjon. Binære tall Litt om tallsystemer generelt. Binære tall. Heksadesimale og oktale tall

IN 147 Program og maskinvare. Velkommen til IN 147. Program- og maskinvare

Dagens tema: Kjøresystemer II

Løsningsforslag til eksamen i INF2270

EKSAMEN. Operativsystemer. 1. Læreboken "A Practical Guide to Red Hat Linux" av Mark Sobell 2. Maks. tre A-4 ark med selvskrevne notater.

Dagens tema C, adresser og pekere

Transkript:

Hvordan en prosessor arbeider, del 1 Læringsmål Kompilator, interpret og maskinkode CPU, registre Enkle instruksjoner: de fire regnearter Mer informasjon om temaet

Internett Lokalnett (LAN) Mitt program Programtolker (python, java,...) Operativsystemet Prosessoren (CPU-en) Logiske porter (AND, OR, XOR,...) Transistorer

Hva bør du kunne etter dagens forelesning? Jeg forventer at dere kan 1 lese enkle x64-funksjoner og forstå hva de gjør. 2 kunne skrive x64-instruksjoner som løser et enkelt regnestykke med heltall. Ukeoppgavene er gode eksempler på hva jeg forventer nå og til eksamen.

En interpret Hvordan kjøre et program Dere kan skrive programmer i et programmeringsspråk som Python. Program i Python if 2*area() > max: Python-interpret python3 Det blir tolket av en interpret. Men hvordan lager man en interpret?

En kompilator En annen måte å kjøre et program på Program i C if (a==0) a++; Andre programgrammeringsspråk som C og C++ oversetter i stedet programmet til maskinkode. Kompilator gcc Maskinkode 00101111... Maskinkode kan utføres av CPU-en i en datamaskin.

En kompilator Slik får man laget en interpret Takket være en interpret skrevet i C kan man utføre programmer skrevet i Python. Program i Python if 2*area() > max: while (*p) { Python-interpret i C Python-interpret python3 gcc

Hva er så maskinkode? Et enkelt eksempel I Python kan vi skrive funksjonen nineteen som gir verdien 19 som resultat: def nineteen(): return 19 nineteen.py print("nineteen()", "=", nineteen())

Hva er så maskinkode? Maskinkoden for funksjonen nineteen er 0x48 0xC7 0xC0 0x13 0x00 0x00 0x00 0xC3 Hvordan kan man lage slik kode? Assemblerkode Assemblerkode er huskekoder for instruksjonene, så vi skriver heller funksjonen vår slik: movq $19,%rax # Hent 19. ret (Tegnet # angir en kommentar.)

x64 Intel x64 Vår eksempel-cpu kjører x64 og er laget av Intel og AMD. Den finnes i de aller fleste personlige datamaskiner i dag.

x64 Von Neumann-maskinen CPU CPU ALU Registre inndata utdata inndata utdata Minne prosessor Minne prosessor

Registrene Registre Inne i CPUen ligger noen få spesielle variabler kalt registre. De består alle av 8 byte (64 bit). Vi skal bruke 9 av dem: Navn Bruk %RAX «Accumulator», dvs svar %RCX «Counter» %RDX «Data» %RDI «Destination index» %RSI «Source index» %R8 alt mulig %R9 alt mulig %R10 alt mulig %R11 alt mulig

Det viktigste er å flytte ting! Instruksjoner Den aller viktigste instruksjonen heter movq og den kopierer data. Den kan kopiere en fast verdi (angitt med $ foran) til et register innholdet av ett register til et annet Eksempler movq $4,%RAX # Kopier verdien 4 til register %RAX movq %RDX,%R8 # Kopier innholdet av register %RDX til %R8

Resultatet; hvor skal det? Funksjonens svar Målet med en funksjon er å beregne et svar som skal ligge i %RAX-registeret. Funksjonen nineteen Vår funksjon nineteen finner da svaret slik: movq $19,%rax # Hent 19. Retur Når svaret er klart, kan funksjonen returnere ved å bruke instruksjonen ret: ret

Navnet på funksjonen Funksjonens navn Nå kan vi gi funksjonen vår navnet sitt. Til dette trenger vi to linjer:.globl nineteen: nineteen

Den ferdige funksjonen Funksjonen nineteen komplett Da har vi den komplette filen nineteen.s: nineteen.s # def nineteen(): Hent verdien 19..globl nineteen nineteen: movq $19,%rax # Hent 19. ret (Filer med assemblerkode skal slutte med.s på samme måte som Python-filer skal slutte på.py.) I assemblerkode er alle linjer unntatt navn: rykket inn.

Vi må teste funksjonen Testing av funksjonen Til å teste funksjonen vår trenger vi et lite C-program: #include <stdio.h> extern long nineteen (); test-nineteen.c int main (void) { long res = nineteen(); printf("nineteen() = %d\n", res); } (Dere skal slippe å skrive slike C-programmer; de vil dere alltid få utlevert helt ferdig.)

Vi må teste funksjonen Kjøring av testprogrammet Testprogrammet koples sammen med funksjonen vår og kjøres etter denne oppskriften: $ gcc -o test-nineteen test-nineteen.c nineteen.s $./test-nineteen nineteen() = 19 ($-tegnet i eksemplene brukes for å angi at linjen er en kommando som brukeren gir.)

Enkel regning Noen flere instruksjoner I tillegg til instruksjonene movq Flytt en verdi ret Returner fra en funksjon har vi noen instruksjoner for regning: addq Legg til en verdi subq imulq negq Trekk fra en verdi Multipliser med en verdi Skift fortegn på en verdi

Alle skikkelige funksjoner har parametre Parametre Funksjoner kan ha parametre, dvs verdier som brukes som grunnlag for beregningen. I assemblerkode ligger parametrene i disse registrene når funksjonen vår blir kalt: %RDI %RSI %RDX 1. parameter 2. parameter 3. parameter NB! Dette gjelder for Linux. Andre systemer, som Windows, har andre regler.

Alle skikkelige funksjoner har parametre Et eksempel Vi skal lage en funksjon som dobler en verdi. I Python ville vi skrevet: def doble (v): return v + v print("doble(88)", =, doble(88)) I assemblerkode skriver vi doble.s # def doble(v): Beregn den doble verdien av v. doble:.globl doble movq %rdi,%rax # Hent v addq %rdi,%rax # og legg til v. ret

Alle skikkelige funksjoner har parametre Et testprogram kan se slik ut: #include <stdio.h> extern long doble (long v); test-doble.c int main (void) { long res = doble(17); printf("doble(17) = %d\n", res); } Resultatet av kjøringen blir $ gcc -o test-doble test-doble.c doble.s $./test-doble doble(17) = 34

Divisjon Divisjon Divisjon er litt sær, men følgende oppskrift fungerer: 1 Legg dividend (den verdien vi skal dele) i %RAX. 2 Legg divisor (den verdien vi skal dele på) i ett av registrene %R8, %R9, %R10 eller %R11. 3 Utfør de to instruksjonene cqo idivq %rn 4 Da kommer svaret i %RAX og resten fra divisjonen i %RDX.

Divisjon Et eksempel Skriv en funksjon som beregner a b c. f.s # def f(a, b, c): Beregn a * b / c f:.globl f movq %rdi,%rax # Hent a og imulq %rsi,%rax # gang med b movq %rdx,%r8 # Hent c og cqo # idivq %r8 ret # del a*b med c.

Divisjon Testprogrammet ser slik ut: #include <stdio.h> test-f.c extern long f (long a, long b, long c); int main (void) { long res = f(171, 211, 10); printf("f(171,211,10) = %d\n", res); } Resultatet av kjøringen blir $ gcc -o test-f test-f.c f.s $./test-f f(171,211,10) = 3608

For de som syntes dette var interessant Mer å lese Randal E Bryant & David R O Hallaron: Computer systems a programmer s perspective, 3rd edition. Pearson 2016. https://software.intel.com/en-us/articles/ introduction-to-x64-assembly er en kort introduksjon til x64 fra Intel. http://download.intel.com/products/processor/manual/ 325462.pdf er den fulle spesifikasjonen av x64. 4670 sider!