1 / 76

IS1200 Datorteknik

IS1200 Datorteknik. Föreläsning 5 Maskinnära programmering med C. Föreläsning 5 Innehåll, rubriker. Lagring av datatyper Minnesallokering, statisk / dynamisk Compile-time / Run-time .text, .data, .bss, .stack, .heap value, address, pointer, type cast vector, array , struct

cairo-woods
Télécharger la présentation

IS1200 Datorteknik

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. IS1200 Datorteknik Föreläsning 5 Maskinnära programmering med C IS1200 Datorteknik, föreläsning 5

  2. Föreläsning 5Innehåll, rubriker • Lagring av datatyper • Minnesallokering, statisk / dynamisk • Compile-time / Run-time • .text, .data, .bss, .stack, .heap • value, address, pointer, type cast • vector, array , struct • bit-operations • malloc / free IS1200 Datorteknik, föreläsning 5

  3. Ö10 F10 Hemlab-3 Hemlab-2 Hemlab-1 Ö2 Ö1 Ö3 Ö5 Ö7 Ö8 Ö9 Ö6 Ö4 F1 F5 F7 F8 F4 F6 F9 F3 F2 Tentamen LAB-2 LAB-3 LAB-1 IS1200 Datorteknikhttp://www.ict.kth.se/courses/IS1200 Assemblerkod 4 stegs pipeline Nios2time C-kod Nios2io Nios2int Cache-minnen CPU-scheduling IS1200 Datorteknik, föreläsning 5

  4. Litteraturhänvisningar Kursbokens avsnitt • 3.2 och 3.7 Heltal och flyttal • 4.5 och 4.6 Stack med mera • Appendix C • Ex-samling del 4 • Hemlaboration 1 (Vägen till C: Bilting/Skansholm, sidorna 135 m.fl.) IS1200 Datorteknik, föreläsning 5

  5. Datatyperheltalstyper Heltalstyper används för att representera följande slag av data: • Heltal utan tecken(unsigned int) • Heltal med tecken (signed int) • Tecken i texter (t.ex. ASCII-kod) • Logiska värden (False/True = 0/icke 0) • Bitmönster (t.ex. 0x000F) IS1200 Datorteknik, föreläsning 5

  6. Datatyperheltalstyper I C finns fyra storlekar av heltalstyper • char (minst 8 bitar) • short int (minst 16 bitar) • int (minst 16 bitar) • long int (minst 32 bitar) Var och en signed eller unsigned char <= short <= int <= long #include <limits.h> /* aktuell implementation */ IS1200 Datorteknik, föreläsning 5

  7. Operatorn sizeof() Det finns en operator/funktion, sizeof(), som kan användas för att ta reda på storleken räknat i antal bytes, för en datatyp eller en variabel int antal; ... nrbytes = sizeof(something); sizeof() ”utförs” ”at compile time” ! (i förväg) dvs vid kompileringen, inte vid exekveringen IS1200 Datorteknik, föreläsning 5

  8. DatatyperUnsigned Integer 0000 1111 0101 0000 1111 0111 0111 0000 binärkod hexadecimal kod 0x 0F 50 F7 70 tolkas som positivt heltal ”som vanligt” med viktad binär kod, 1-tal, 2-tal, 4-tal, ... i analogi med decimal viktad kod 1-tal, 10-tal, 100-tal, ... IS1200 Datorteknik, föreläsning 5

  9. DatatyperSigned Integer 0000 1111 0101 0000 1111 0111 0111 0000 binärkod hexadecimal kod 0x 0F 50 F7 70 negativa tal lagras oftast i 2-komplement-representation MSB - most significant bit är teckenbit. Koden för ett negativt värde erhålls genom att invertera varje bit och addera värdet 1 IS1200 Datorteknik, föreläsning 5

  10. Binärkod för värdet minus ett Koden för + 1 0000 0000 .... 0001 Bitvis invertering 1111 1111 .... 1110 Addition av ett + 0000 0000 .... 0001 Och vi får kod för -1 1111 1111 .... 1111 (Koden för -1 är alltid ”bara ettor” för alla ordlängder) IS1200 Datorteknik, föreläsning 5

  11. värdet av kod för negativt tal Koden för negativt tal 1111 .... 1010 0101 Bitvis invertering 0000 .... 0101 1010 Addition av ett + 0000 .... 0000 0001 Och vi får kod 0000 .... 0101 1011 Som tolkas till värdet 1+2+8+16+64 = 91 IS1200 Datorteknik, föreläsning 5

  12. 0xDD 0xAA 0xAA 0xAA 0xDD 0xDD 0xAA 0xDD 0xCC 0xBB 0xCC 0xCC 0xCC 0xBB 0xBB 0xBB Byte order, i minnetlittle or big endian Skrivning av 0xAABBCCDD till Minnet Mot låga adresser Little endian byte ordering Big endian byte ordering ”lill-ändan först” ”stor-ändan först” Mot höga adresser Nios-2/Intel Motorola IS1200 Datorteknik, föreläsning 5

  13. 0x00 0x57 0x00 0x57 0x57 0x00 0x59 0x00 0x00 0x00 0x59 0x59 Byte order, i minnetlittle or big endian Läsning av 0x00005957 från Minnet Mot låga adresser Little endian byte ordering Big endian byte ordering ”lill-ändan först” ”stor-ändan först” Mot höga adresser Nios-2/Intel Motorola IS1200 Datorteknik, föreläsning 5

  14. DatatyperChar En byte - 8 bitar - oktett exempel binärkod 0110 0001 = ascii-koden för lilla ”a” hexadecimal kod 0x61 = ’a’ i Nios-2-assembler (Sid 95 i kursboken) IS1200 Datorteknik, föreläsning 5

  15. DatatyperFlyt-tal • float, t.ex. 32 bitar • double, t.ex. 64 bitar • long double, t.ex. 128 bitar (implementationsberoende) IS1200 Datorteknik, föreläsning 5

  16. Decimalt Flyttal • -047,120 #decimalt fixtal • -047,120 * 100 #decimalt flyttal • -04,7120 * 101 #normaliserat flyttal exponent mantissa tecken IS1200 Datorteknik, föreläsning 5

  17. Binärt Flyttal • -0101.110 #binärt fixtal • -0101.110 * 20 #binärt flyttal • -01.01110 * 22 #normaliserat flyttal exponent mantissa tecken IS1200 Datorteknik, föreläsning 5

  18. Binärt Flyttalfloat (32 bitar) • -0101.110 #binärt tal • -0101.110 * 20 #binärt flyttal • -01.01110 * 22 #normaliserat flyttal Exponent lagras i excess-127-kod Mantissa lagras med enbart signifikand Tecken, 0 är +, 1 är - IS1200 Datorteknik, föreläsning 5

  19. Binärt Flyttaldouble (64 bitar) • -0101.110 #binärt tal • -0101.110 * 20 #binärt flyttal • -01.01110 * 22 #normaliserat flyttal Exponent lagras i excess-1023-kod Mantissa lagras med enbart signifikand Tecken, 0 är +, 1 är - IS1200 Datorteknik, föreläsning 5

  20. Floating Point NumberIEEE 754, 32 bitars float 11000001100010000000000000000000 FLOAT: s exponent signifikand värde = (-1)s * (1 + signifikand2 ) * 2 (exponent-127) -17 (dec) = - 1 0001 (bin) = - 1.0001 * 24 11000 0011 000 1000 0000 0000 0000 0000 1100 0001 1000 1000 0000 0000 0000 0000 0x C1 88 00 00 IS1200 Datorteknik, föreläsning 5

  21. - + 0xC1 0xC1 0x00 0x00 0x88 0x00 0x88 0x00 Information, 32 bitar adress / värde Little endian byte ordering FLOAT: -17 i float-format: 0x C1 88 00 00 IS1200 Datorteknik, föreläsning 5

  22. Flyt-talstyper I C finns tre storlekar av heltalstyper • float (troligen 32 bitar) • double (troligen 64 bitar) • long double (troligen 128 bitar) #include <float.h> /* fil med aktuell information om */ FLT_DIG, DBL_DIG, LDBL_DIG, ”decimala siffror” FLT_MIN och FLT_MAX (och DBL och LDBL), min och max nr = sizeof(double); IS1200 Datorteknik, föreläsning 5

  23. Floating Point NumberIEEE 754, 64 bitars double 1 10000000011 000100 ... 00000000000 DOUBLE: s exponent signifikand (-1)s * (1 + signifikand2 ) * 2 (exponent-1023) -17 (dec) = - 1 0001 (bin) = - 1.0001 * 24 1 100 0000 0011 000 1000 0000 ... 0000 1100 0000 0011 0001 0000 0000 ... 0000 0x C0 31 00 00 00 00 00 00 IS1200 Datorteknik, föreläsning 5

  24. - + 0xC0 0x00 0x00 0x00 0xC0 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0x31 0x00 0x00 0x00 Information, 64 bitar adress / värde Little endian byte ordering DOUBLE: -17 i double-format: 0x C0 31 00 00 00 00 00 00 IS1200 Datorteknik, föreläsning 5

  25. Deklaration av variabel (-typ)Definition av variabel (-värde) • Typ-deklaration möjliggör typkontroll för kompilatorn • Deklaration som leder till minnesallokering kallas för definition • Tilldelning av värde vid typ-deklaration leder till definition dvs minnesallokering med värde i minnet int A; /* typdeklaration och minnesallokering */ int B = 17; /* typdeklaration och minnesallokering samt tilldelning av värde */ int B; /* bara typdeklaration av B, tillåtet !!! */ int B = 4712; /* omdefinition, ej tillåten !!! */ IS1200 Datorteknik, föreläsning 5

  26. Typdeklaration av variabler(exempel avser c-kod) • Exempel på typ-deklaration av variabel int a; /* integer a utan värde (värdelös?) */ int b=7; /* integer b med värde 7 */ char c = ’a’; /* char c med värde asciikod för a float fval = 47,11; /* flyttal med värde 47,11 */ double dval = 47,11; /* flyttal med värde 47,11 */ IS1200 Datorteknik, föreläsning 5

  27. - + 0x00 0x57 0x00 0x57 0x00 0x59 0x00 0x59 Information, 32 bitar adress / värde Little endian byte ordering TIME: TIME: IS1200 Datorteknik, föreläsning 5

  28. Information, 32 bitar i minnet adress eller värde ? #define elefant 4712 int TIME = 0x5957; • översätts till .equ elefant, 4712 .data .align 2 TIME: .word 0x5957 • 0x5957 är ett värde som finns lagrat i minnet på en adress med värdet TIME . . . movia r9, 0x5957 # r9:= värdet 0x5957 movia r10, elefant # r10:= värdet elefant = 4712 movia r11, TIME # r11:= adressen (värdet) TIME (kompilatorn vet) ldw r12, 0(r11) # r12 := värdet lagrat på adress TIME dvs 0x5957 IS1200 Datorteknik, föreläsning 5

  29. värden, pekare, adresser(avser c-kod) Användning av ”*” vid typ-deklaration av variabel int a; /* integer a utan värde (värdelös?) */ int b=7; /* integer b med värde 7 */ int* apek; /* pekare till integer */ int *bpek; /* pekare till integer */ char* streng; /* pekare till byte */ (int* pek1, pek2 blir ej samma som int *pek1, *pek2) IS1200 Datorteknik, föreläsning 5

  30. ptr-i ptr-d ptr-c Size of pointer i C-kod - + int * ptr-i; char * ptr-c; double * ptr-d; nr1 = sizeof (double); nr2 = sizeof (double *); IS1200 Datorteknik, föreläsning 5

  31. ptr-t Size of pointer i C-kod - + struct tiger { ... } tiger * ptr-t nr1 = sizeof (tiger); nr2 = sizeof (tiger *); IS1200 Datorteknik, föreläsning 5

  32. ptr-i ptr-d ptr-c Incrementing pointer i C-kod - + ptr ptr = ptr + 1; increment by (sizeof(*ptr)) ptr-+1 ptr ptr-+1 ptr ptr-+1 IS1200 Datorteknik, föreläsning 5

  33. ptr-t Incrementing pointer i C-kod - + ptr ptr-+1 ptr ptr-+1 IS1200 Datorteknik, föreläsning 5

  34. Värden, pekare, adresser (avser c-kod) Användning av ”&” och ”*” vid tilldelningar Adressbildning och avreferering apek = &a /* apek := adressen till a */ b = *apek; /* b:=värdet på adress apek */ bpek = apek; /* kopiera pekarvärde */ a = b; /* kopiera heltalsvärde */ • Typkontroll görs vid kompilering IS1200 Datorteknik, föreläsning 5

  35. Typen void • Typen void är ingen vanlig typ • Void kan användas för att ange att en funktion saknar returvärde, t.ex. void puttime(int time) • Void används för att markera att en funktion inte har några parametrar, t.ex. int main(void) • En pekare till objekt av typen void får peka till ett dataobjekt av godtycklig typ IS1200 Datorteknik, föreläsning 5

  36. Void-pekare(avser C-kod) int tala; /* tala är en integer */ void* vp; /* pekare till ”vad som helst” */ • En voidpekare får ej avrefereras *vp; /* avreferering ger warning */ tala = *vp; /* tilldelning ger dessutom type error */ Använd type cast tala = * ( (int*) vp ); /* korrekt */ IS1200 Datorteknik, föreläsning 5

  37. Type castExplicita typomvandlingar • För att kunna avreferera en void-pekare måste man använda type cast • Exempel: dumbo = * (struct elephant*) vp; /* Tänkbar bakgrund */ struct elephant { char[13] name; int weight; float area; }; struct elephant dumbo; /* Kan man göra nr = sizeof(dumbo); IS1200 Datorteknik, föreläsning 5

  38. vektor, textsträngchar [ ] En vektor av bytes char header [12]; /* 12 bytes */ med index 0 .. 11 En sträng En textsträng char text[] = ”Hello World!”; /* 13 bytes */ /* nul-terminated text-string */ /* text och &text[0] får samma värde men har olika typ !? */ IS1200 Datorteknik, föreläsning 5

  39. ’o’ ’o’ ’l’ 0x00 ’W’ ’H’ ’d’ ’a’ ’r’ ’!’ ’l’ ’l’ ’ ’ Lagring av textsträngChar [ ] C-kod: char text[] = ”Hello World!”; /* text = &text[0] men olika typ */ Assemblerkod: .data text: .asciz ”Hello World!” text: 0 1 2 3 4 5 6 7 8 9 10 11 12 text[4] text[7] IS1200 Datorteknik, föreläsning 5

  40. 0x0A 0x00 0x00 0x0A 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 Heltalsvektorint [ ] C-kod: int vect[] = {1,10,0xA}; /* vect = &vect[0], olika typ */ Assemblerkod: .data .align 2 vect: .word 1, 10, 0xA #little endian byte ordering vect: 0 1 2 3 4 5 6 7 8 9 10 vect[1] vect[2] IS1200 Datorteknik, föreläsning 5

  41. Bit OperationsAssembly program (Nios-II) • Ettställ valda bitar med OR-operation ORI r8, r9, 0x30 • Nollställ valda bitar med AND-operation • (maska fram utvalda bitar) ANDI r8, r4, 0x0F • Invertera valda bitar med XOR-operation XORI r2, r4, 0b10000000 • Invertera alla bitar med NOR-operation NOR r10, r9, r0 IS1200 Datorteknik, föreläsning 5

  42. Bit Operations C-program • Ettställ valda bitar med OR-operation tmp = tmp | 0x30 ; • Nollställ valda bitar med AND-operation • (maska fram utvalda bitar) tmp = status & 0x0F ; • Invertera valda bitar med XOR-operation tmp = val ^ 0b10000000; IS1200 Datorteknik, föreläsning 5

  43. Bit Operations Assembly program (Nios-II) • Skifta höger n steg (heltalsdivision med 2n) SRLI r2, r7, n # det finns även SRAI r2, r7, n • Skifta vänster m steg (multiplikation med 2m) SLLI r9, r4, m # det finns ingen SLAI r9, r4, m • Implementationsberoende • hantering av teckenbiten IS1200 Datorteknik, föreläsning 5

  44. Bit OperationsC-program • Skifta höger n steg (heltalsdivision med 2n) tmp = tmp >> n ; • Skifta vänster m steg (multiplikation med 2m) tmp = tmp << m ; • Implementationsberoende • hantering av teckenbiten IS1200 Datorteknik, föreläsning 5

  45. Bitwise operationsLogical operations • Det finns en operator & i C (bitwise AND) • Det finns en operator | i C (bitwise OR) • Det finns en operator ^ i C (bitwise XOR) • Det finns en operator && i C (logical AND) • Det finns en operator || i C (logical OR) • Det finns EJ operator ^^ i C (logical XOR) IS1200 Datorteknik, föreläsning 5

  46. EditeringExempel på C-kod, lab1-ide’ #define START_TIME 0x5957 /* makrodefinition */ #define TRUE 1 /* TRUE = 1 */ int current_time = START_TIME; /* global initierad variabel */ extern void puttime (int* time); /* subroutine, function, procedure, method */ extern void tick (int* time); extern void delay (int millisek); extern int hexasc (int hexval); int main () { /* huvudprogram, main */ while (TRUE) { puttime (&current_time); tick (&current_time); delay (1000); } } IS1200 Datorteknik, föreläsning 5

  47. funktionen tick i C-kod void tick (int* inpar) /* se lab nios2time */ { register int time; time = *inpar; /* ~LDW dreg, 0(ireg) */ time = time + 1; if ((time & 0x000F) == 0x000A) time = time - 0x000A + 0x0010; … /* mer kod ska stå här */ *inpar = time; } IS1200 Datorteknik, föreläsning 5

  48. Tips till Kompilator • C-koden register int time; • Medför att kompilatorn placerar time i ett register (om det finns något ledigt kvar) • Detta kan leda till färre minnesreferenser och därmed (eventuellt) snabbare exekvering, pga mindre risk för D-cache-missar IS1200 Datorteknik, föreläsning 5

  49. memcpy i C-kod(block data transfer) void memcpy (char* dst, char* src, int num) { int tmp; register int i; for (i=0; i<num, i=i+1) tmp = *src; *dst = tmp; dst = dst + 1; src = src + 1; } IS1200 Datorteknik, föreläsning 5

  50. memcpy i C-kod(block data transfer) void memcpy (char* dst, char* src, int num) { register int i; for (i=0; i<num, i=i+1) *dst++ = *src++; } IS1200 Datorteknik, föreläsning 5

More Related