Dagens tema. Oppsummering om assemblerspråk. Programmering i C. Bakgrunn. Et minimalt eksempel med forklaring. Datatyper i C.

Like dokumenter
Programmeringsspråket C

Programmeringsspråket C

Programmeringsspråket C

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

Anbefalt litteratur: Pensum-bøker: Forelesere: Velkommen til INF Introduksjon til operativsystemer og datakommunikasjon

Velkommen til INF Introduksjon til operativsystemer og datakommunikasjon

Velkommen til INF Introduksjon til operativsystemer og datakommunikasjon

Velkommen til INF1060. Introduksjon til operativsystemer og datakommunikasjon

Programmeringsspråket C Del 2

Programmeringsspråket C Del 2

Programmeringsspråket C Del 2

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

Del 1 En oversikt over C-programmering

Programmeringsspråket C Del 2. Michael Welzl

Kapittel 1 En oversikt over C-språket

IN 147 Program og maskinvare

Dagens tema C, adresser og pekere

Ark 3 av 26. printf("i adresse %08x ligger b med verdien %d.\n", &b, b); printf("i adresse %08x ligger a med verdien %d.

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

IN 147 Program og maskinvare

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

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

Dagens tema. Mer om C Enkle datatyper Sammensatte datatyper: Vektorer og matriser Tekster Mengder Strukturer Unioner Ringbuffere

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

Vektorer. Dagens tema. Deklarasjon. Bruk

Dagens tema. Kort repetisjon om rutiner. Programmering i C Variable og adresser. Vektorer. Tekster. Preprosessoren. Separat kompilering

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

IN 147 Program og maskinvare

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

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

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

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

Pensum Hovedtanker Selvmodifiserende Overflyt Veien videre Eksamen. Oppsummering

Programmeringsspråket C Del 3

En oppsummering (og litt som står igjen)

Dagens tema: Datastrukturer

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Hvordan en prosessor arbeider, del 1

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

Ark 1 av 18. programmeringsspråkenes. Velkommen til IN 211. verden. IN 211 Programmeringsspråk

Grunnleggende programmering i C

Nybegynnerkurs i C. Øyvind Grønnesby. 14. oktober Introduksjon Typer Operatorer Kontrollstrukturer Pekere Makroer Lenker

INF 1000 høsten 2011 Uke september

Programmeringsspråket C Del 3

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Dagens tema. Rutiner i LC-2 Og her er tilsvarende kode for LC-2: Funksjoner i C Her er det samme programmet i C: Kort repetisjon om rutiner

Dagens tema INF1070. Signaturer. Typekonvertering. Pekere og vektorer. struct-er. Definisjon av nye typenavn. Lister

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

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

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Dagens tema. Adresser som parametre Dynamisk allokering Signaturer Definisjon av nye typenavn Typekonvertering Pekere og vektorer

Programmeringsspråket C Del 3. Hans Petter Taugbøl Kragset

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Velkommen til INF2100

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

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

Velkommen til INF2100 Jeg er Dag Langmyhr

Signaturer. Dagens tema. En vanlig feil int-funksjon. Dette kan noen ganger gi rare feilmeldinger: INF1070 INF1070 INF1070 INF1070

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

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

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

Python: Variable og beregninger, input og utskrift. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Velkommen til INF1060 høsten 2017

Dagens tema: Enda mer MIPS maskinkode

Velkommen til INF2100. Bakgrunnen for INF2100. Hva gjør en kompilator? Prosjektet. Jeg er Dag Langmyhr

Del 4 Noen spesielle C-elementer

Forelesning inf Java 5

Dagens tema INF1070. Info om C. Cs preprosessor. Feilsøking. Dag Langmyhr,Ifi,UiO: Forelesning 31. januar 2005 Ark 1 av 29

Informasjon om C. Dagens tema INF1070 INF1070 INF1070 INF1070. Den viktigste kilden til informasjon om C (utenom en god. C-funksjonene.

Forelesning inf Java 5

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

Forelesning inf Java 4

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Feilmeldinger, brukerinput og kontrollflyt

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

IN 147 Program og maskinvare

2 Om statiske variable/konstanter og statiske metoder.

Dagens tema. LC-2 LC-2 er en «ekstrem-risc»; den har 16 instruksjoner og 3 adresseringsmåter.

Programmering Høst 2017

156C. Algoritmer og maskinspråk. IT1101 Informatikk basisfag. Maskinspråk: det maskinen forstår. Assembler / assemblerspråk

INF1000: noen avsluttende ord

Velkommen til INF2100

Programmeringsspråket C Del 2. Hans Petter Taugbøl Kragset

Pekere og vektorer. Dagens tema. I C gjelder en litt uventet konvensjon:

Dagens tema. Det siste om C Pekere og vektorer. Pekere til pekere. Vanlige pekerfeil. struct-er og typedef. Lister. Feilsøking

2 Om statiske variable/konstanter og statiske metoder.

INF1000: Forelesning 7

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet (kalt kildekoden): Hva er kompilering?

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Tre måter å lese fra terminal.

Blokker og metoder INF1000 (Uke 6) Metoder

Løsningsforslag ukeoppg. 3: sep (INF Høst 2011)

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Transkript:

Dagens tema Oppsummering om assemblerspråk Programmering i C (kapittel 11 og 12 i Patt&Patel-boken) Bakgrunn Et minimalt eksempel med forklaring Datatyper i C Operatorer i C Et eksempel til med forklaring Et siste eksempel Ark 1 av 23

Assemblerprogrammering Fordeler Rask kode. Liten kode. Ulemper Mye arbeid. Lett å gjøre feil. Alt må skrives om ved overgang til ny prosessor. Konklusjon Det beste er å skrive størstedelen av et program i et høynivåspråk med små tidskritiske deler i assembler. En annen ting er at kunnskap om hva som skjer på maskinspråknivå er nyttig ved programmering i et høynivåspråk. Hvorfor er bruk av pekere så mye raskere enn oppslag i vektorer («array-er»)? Ark 2 av 23

Programmeringsspråket C Bakgrunn Implementasjon av Unix ved AT&Ts laboratorium i Palo Alto 1960 75. Navnet kommer fra BCPL B C. Opphavsmannnen heter Dennis Ritchie. ANSI-standard i 1988. Formål: Kunne programmere oversiktlig; lettlest kode. Tilgang til maskinens ressurser. Lite maskinavhengige programmer. Kompakte programmer. Raske programmer. Ark 3 av 23

Cs fortrinn Mulig å skrive raske programmer. Muligheter for «massering». Gode muligheter for strukturering av data og program. Svært kompakt kode: Simula C n := n+1; A[++n] *= 3.1; A[n] := A[n]*3.1; Mulig å skrive elegante, oversiktlige og portable programmer. Fast standard (ANSI C) fra høsten 1988. Finnes overalt. Ark 4 av 23

Cs svake sider Ofte lite portable hvis man ikke tenker på det mens man koder; bedre etter ANSI C. C tilbyr programmereren større frihet. Kompilatoren vil dog oppdage færre feil. Java c = (char)((int)c + 1); C c = c+1; Muligheter for kryptisk kode: A[*(*x)++=y]+=4; Å programmere i Java er som å kjøre en Volvo stasjonsvogn; den duver rolig av gårde på veien, men man kommer trygt frem. Å programmere i C er som å kjøre en Ferrari; den kan gå uhyggelig fort i svingene, men man havner av og til i grøften. ukjent opphavsmann I C er det viktigere at det går fort enn at svaret blir riktig! også ukjent opprinnelse En skrivefeil i C er ingen feil; det er bare et annet program. enda en ukjent meningsytrer Ark 5 av 23

Hvorfor er det nyttig å lære C? Det er flere grunner: C er sannsynligvis det mest utbredte språket i dag. C brukes i et flertall av større programmeringsprosjekter. C og Unix er uløselig knyttet sammen. Med C kan man skrive raskere kode enn de fleste andre språk. Med C kan man skrive svært kompakt kode. Programmering i C gir en følelse av hvorledes datamaskinen fungerer. Ark 6 av 23

Et minimalt eksempel «Alle» lærebøker i programmering har med følgende lille eksempel: #include <stdio.h> int main(void) { printf("hallo, alle sammen!\n"); } (Det var Kernighan & Ritchies første bok om C som startet denne moten!) I Java ser programmet slik ut: class Hello { public static void main(string args[]) { System.out.println("Hallo, alle sammen!"); } } Kompilering Følgende kommandoer kan brukes for å kompilere programmet: cc hallo.c -o hallo gcc hallo.c -o hallo Det kompilerte programmet kjøres med hallo./hallo Ark 7 av 23

Forklaring Program Et program er en liste av deklarasjoner av variable og funksjoner: Java Klasse-deklarasjoner C Deklarasjoner Hovedprogrammet (11.5.1 i Patt&Patel-boken) «Hovedprogrammet» er en funksjon ved navn main: Java C public static void main(... ) { int main(void). { }. } Store og små bokstaver Det er forskjell på store og små bokstaver i C. MAIN, Main og main er tre helt ulike navn. Ark 8 av 23

Funksjoner En C-funksjon ligner veldig på en metode i Java. Den består alltid av fire deler: type på returverdien. Hvis ingen returverdi, skrives void. navn på funksjonen. parameterliste med typeangivelse av hver parameter. Til forskjell fra Java: hvis det ikke er noen parametre, skrives void. kroppen som er selve funksjonen. Den er omsluttet av { og }. Returverdien angis med en return-setning. Ark 9 av 23

Tekstkonstanter Tekstkonstanter skrives med " foran og bak. Java "En tekst" C "En tekst" I C kan vi legge inn spesialtegn i teksten; det vanligste er \n som angir linjeskift. Java "Hei!\n" C "Hei!\n" Ark 10 av 23

Utskrift (11.5.4 i Patt&Patel-boken) Utskrift skjer via kall på funksjonen printf. Eventuelt linjeskift legges inn i teksten. Java C System.out.print("Hei, "); printf("hei, "); System.out.println("dere!"); printf("dere!\n"); Utskrift av tall Med %d i teksten kan man angi at det skal settes inn et tall. Dette tallet må komme senere i parameterlisten. Java System.out.println(a + " og " + b); C printf("%d og %d\n", a, b); Ark 11 av 23

Datatyper i C (12.2.1 i Patt&Patel-boken) I LC-2 hadde vi kun én datatype: 2-bytes ord med bit-mønster. I C har vi diverse: Navn Alternativt Ant byte signed char char 1 unsigned char char 1 short signed short 2 unsigned short 2 int signed int 2 4 unsigned int unsigned 2 4 long signed long 4 unsigned long 4 Standarden sier at det er udefinert om char betyr signed char eller unsigned char så det varierer. Ark 12 av 23

Operatorer (12.3 i Patt&Patel-boken) Aritmetiske operatorer C har de vanlige aritmetiske operatorene: + Addisjon Subtraksjon * Multiplikasjon / Divisjon % Modulo (rest ved divisjon) Disse kan også brukes til oppdatering av variable: Koden...... gir det samme som... a+=x; a =x;. a=a+x; a=a x;. Ark 13 av 23

Sammenligninger Sammenligningsoperatorene er også de samme som i Java. == Likhet!= Ulikhet < Mindre enn <= Mindre enn eller lik > Større enn >= Større enn eller lik Disse operatorene gir 1 om sammenligningen holder og 0 ellers. NB! Ikke bland sammen = og ==! Logiske verdier Det finnes ingen type boolean i C! I stedet brukes heltall der 0 er false og alle andre verdier er true. Ark 14 av 23

Logiske operatorer!a 1oma=0; 0 ellers a&&b 1oma 0og b 0; 0 ellers a b Maskeoperatorer 1oma 0eller b 0; 0 ellers ~ not & and or ^ xor NB! Det er forskjell på logiske og maskeoperatorer! For eksempel er 1&&4gir 1 1&4gir 0 Ark 15 av 23

Et eksempel til (11.5 og figur 11.2 i Patt&Patel-boken) Dette er et lite eksempel som ber om et tall, leser det og så teller fra det ned til 0. > cc countdown.c -o countdown > countdown ===== Countdown Program ===== Enter a positive number: 5 5 4 3 2 1 0 Ark 16 av 23

/* Program Name : countdown, our first C program * * Description : This program prompts the user to type in a * positive number and counts down from that number to 0, * displaying each number along the way. */ /* The next two lines are preprocessor directives */ #include <stdio.h> #define STOP 0 /* Function : main */ /* Description : prompts user for input, then display countdown */ int main(void) { /* Variable declarations */ int counter; /* Hold intermediate count values */ int startpoint; /* Starting point for count down */ /* Prompt the user for input */ printf("===== Countdown Program =====\n"); printf("enter a positive integer: "); scanf("%d", &startpoint); } /* Count down from the input number to 0 */ for (counter = startpoint; counter >= STOP; counter--) printf("%d\n", counter); Ark 17 av 23

Forklaring Definisjonspakker hentes inn med #include. Den vanligste er for lesing og skriving: #include <stdio.h> Det er mulig å definere konstanter med #define STOP 0 (Mer om dette siden.) Man kan lese tall (og tegn eller ord) med scanf. Første parameter angir formatet (som for printf). Øvrige parametre gir variablene verdiene skal legges inn i. NB! Variablene må har en «&» foran seg! (Forklaring kommer siden.) for-løkken benyttes til å utføre kode et fast antall ganger. Den litt eiendommelige syntaksen er egentlig en kortform for counter = startpoint; while (counter >= STOP) { printf("%d\n", counter); counter--; } Ark 18 av 23

Operatoren «++» brukes til å øke en variabel med 1. Om den står foran variabelen, foretas økningen før vi henter verdien. Koden...... gir samme resultat som... a = ++x; a = x++; x=x+1;a=x; a=x;x=x+1; Tilsvarende brukes til å senke en variabel med 1. Ark 19 av 23

Et siste eksempel (figur 12.11 i Patt&Patel-boken) Dette eksemplet gjør intet fornuftig men demonstrerer variable og operatorer i C. En kjøring ser slik ut: > cc simple.c -o simple >./simple The results are : outlocala = 0, outlocalb = 6 På de neste arkene kommer akkurat samme kode i LC-2 assemblerkode. Dette er kode som en kompilator ville laget om den hadde eksistert. Ark 20 av 23

#include <stdio.h> int inglobal; /* Variable inglobal is a global variable */ /* because is declared outside of all blocks */ main() { int inlocal; /* Variables inlocal, outlocala, outlocalb */ int outlocala; /* are all local to main */ int outlocalb; /* Initialize */ inlocal = 2; /* NB! Misprint in the book! */ inglobal = 3; /* Perform calculations */ outlocala = inlocal++ & ~inglobal; outlocalb = (inlocal + inglobal) - (inlocal - inglobal); } /* Print out results */ printf("the results are : outlocala = %d, outlocalb = %d\n", outlocala, outlocalb); Ark 21 av 23

main: LEA R5,Global ; (Lagt til av meg!) LEA R6,Local ; AND R0, R0, #0 ADD R0, R0, #2 ; The compiler assigns variable a an offset of 3 STR R0, R6, #3 ; inlocal = 2; AND R0, R0, #0 ADD R0, R0, #3 ; inglobal assigned to offset 0 in global area STR R0, R5, #0 ; inglobal = 3; LDR R0, R6, #3 ; get value of inlocal: r0 contains original value ADD R1, R0, #1 ; increment inlocal STR R1, R6, #3 ; inlocal++ LDR R1, R5, #0 ; get value of inglobal NOT R1 ; ~inglobal AND R2, R0, R1 ; calculate inlocal & ~inglobal STR R2, R6, #4 ; outlocala = inlocal++ & ~inglobal; ; The variable outlocala has an offset of 4 LDR R0, R6, #3 ; get value of inlocal LDR R1, R5, #0 ; get value of inglobal ADD R0, R0, R1 ; calculate inlocal + inglobal Ark 22 av 23

LDR R2, R6, #3 ; get value of inlocal LDR R3, R5, #0 ; get value of inglobal NOT R3 ADD R3, R3, #1 ; calculate -inglobal ADD R2, R2, R3 ; calculate inlocal - inglobal NOT R2 ADD R2, R2, #1 ; calculate -(inlocal - inglobal) ADD R0, R0, R2 ; (inlocal + inglobal) - (inlocal - inglobal) STR R0, R6, #5 ; outlocalb=(inlocal+inglobal)-(inlocal-inglobal) ; The variable outlocalb has an offset of 5 : <code for calling the function printf> : Global:.fill 0 ; inglobal (offset 0) Local:.fill 0 ;.fill 0 ;.fill 0 ;.fill 0 ; inlocal (offset 3).fill 0 ; outlocala (offset 4).fill 0 ; outlocalb (offset 5) Ark 23 av 23