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