1 / 72

IS1200 Datorteknik

IS1200 Datorteknik. Föreläsning 5 Maskinnära programmering med C ht 2009 – vt 2010 (period 2-3) För D-2. Föreläsning 5 Innehåll, rubriker. Lagring av datatyper Minnesallokering, statisk / dynamisk Compile-time / Run-time .text, .data, .bss, .stack, .heap

verdi
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 ht 2009 – vt 2010 (period 2-3) För D-2 IS1200 Datorteknik ht2009 föreläsning 5, (D2)

  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 ht2009 föreläsning 5, (D2)

  3. Ö10 F10 Hemlab-3 Hemlab-2 Hemlab-1 Ö4 Ö2 Ö1 Ö3 Ö6 Ö7 Ö8 Ö9 Ö5 F3 F1 F2 F4 F8 F5 F7 F9 F6 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 Hösten 2009 Våren 2010 IS1200 Datorteknik ht2009 föreläsning 5, (D2)

  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 ht2009 föreläsning 5, (D2)

  5. Datatyperheltalstyper Heltalstyper används för att representera följande slag av data: • Teckenlösa heltal (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 ht2009 föreläsning 5, (D2)

  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 ht2009 föreläsning 5, (D2)

  7. Sizeof() Det finns en 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; ... antal = sizeof(antal); Sizeof() ”utförs” ”at compile time” ! IS1200 Datorteknik ht2009 föreläsning 5, (D2)

  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 ht2009 föreläsning 5, (D2)

  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 ht2009 föreläsning 5, (D2)

  10. Binärkod för värdet minus ett Koden för plus 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 IS1200 Datorteknik ht2009 föreläsning 5, (D2)

  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 ht2009 föreläsning 5, (D2)

  12. 0x00 0x57 0x00 0x57 0x57 0x00 0x59 0x00 0x00 0x00 0x59 0x59 Byte order, i minnetlittle or big endian 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 ht2009 föreläsning 5, (D2)

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

  14. DatatyperFlyt-tal • float, t.ex. 32 bitar • double, t.ex. 64 bitar • long double, t.ex. 128 bitar Enligt Bilting sid 50 • Minst 6 decimala siffrors noggranhet • Åtminstone upp till 1037 • Åtminstone ner till 10-37 (implementationsberoende) IS1200 Datorteknik ht2009 föreläsning 5, (D2)

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

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

  17. 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 ht2009 föreläsning 5, (D2)

  18. 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 ht2009 föreläsning 5, (D2)

  19. 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 ht2009 föreläsning 5, (D2)

  20. - + 0xC1 0xC1 0x00 0x00 0x88 0x00 0x88 0x00 Information, 32 bitar adress / värde Little endian byte ordering FLOAT: 0x C1 88 00 00 IS1200 Datorteknik ht2009 föreläsning 5, (D2)

  21. 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 ht2009 föreläsning 5, (D2)

  22. 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 1100 0000 0011 000 1000 0000 ... 0000 1100 0000 0011 0001 0000 0000 ... 0000 0x C0 31 00 00 00 00 00 00 IS1200 Datorteknik ht2009 föreläsning 5, (D2)

  23. - + 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: 0x C0 31 00 00 00 00 00 00 IS1200 Datorteknik ht2009 föreläsning 5, (D2)

  24. 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 ht2009 föreläsning 5, (D2)

  25. 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 ht2009 föreläsning 5, (D2)

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

  27. Information, 32 bitar i minnet adress / 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 ht2009 föreläsning 5, (D2)

  28. 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 ej samma som int *pek1, *pek2) IS1200 Datorteknik ht2009 föreläsning 5, (D2)

  29. Ptr-i ptr-d ptr-c Size of pointer i C-kod - + int * ptr-i char * ptr-c double * ptr-d nr = sizeof (double); nr = sizeof (double*); IS1200 Datorteknik ht2009 föreläsning 5, (D2)

  30. 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 ht2009 föreläsning 5, (D2)

  31. Typen void • Typen void är ingen vanlig typ • Void används 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 ht2009 föreläsning 5, (D2)

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

  33. Type castExplicita typomvandlingar • För att kunna avreferera en void-pekare måste man använda type cast • Exempel: dumbo = * (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 ht2009 föreläsning 5, (D2)

  34. 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 ht2009 föreläsning 5, (D2)

  35. ’o’ ’o’ ’l’ 0x00 ’W’ ’H’ ’d’ ’a’ ’r’ ’!’ ’l’ ’l’ ’ ’ Lagring av textsträngChar [ ] C-kod: char text[] = ”Hello World!”; /* text = &text[0] */ 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 ht2009 föreläsning 5, (D2)

  36. 0x0A 0x00 0x00 0x0A 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 Heltalsvektorint [ ] C-kod: int vect[] = {1,10,0xA}; /* vect = &vect[0], 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 ht2009 föreläsning 5, (D2)

  37. 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 ht2009 föreläsning 5, (D2)

  38. 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 ht2009 föreläsning 5, (D2)

  39. Bit Operations Assembly program (Nios-II) • Skifta höger n steg (heltalsdivision med 2n) SRLI r2, r7, n • Skifta vänster m steg (multiplikation med 2m) SLLI r9, r4, m • Implementationsberoende • hantering av teckenbiten IS1200 Datorteknik ht2009 föreläsning 5, (D2)

  40. 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 ht2009 föreläsning 5, (D2)

  41. 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 ht2009 föreläsning 5, (D2)

  42. 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 ht2009 föreläsning 5, (D2)

  43. 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 ht2009 föreläsning 5, (D2)

  44. 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 ht2009 föreläsning 5, (D2)

  45. 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 ht2009 föreläsning 5, (D2)

  46. 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 ht2009 föreläsning 5, (D2)

  47. memcpy i Nios-2-kod memcpy: mov r8, r4 # srcpekare mov r9, r5 # destpekare mov r10, r6 # counter loop: ble r10, r0, out # kolla om klart fast: ldb r12, 0(r8) # läs 1 byte addi r8, r8, 1 # öka src-pekare stb r12, 0(r9) # skriv 1 byte addi r9, r9, 1 # öka dst-pekare subi r10, r10, 1 # minska counter br loop # alt: bgt r10, r0, fast out: ret IS1200 Datorteknik ht2009 föreläsning 5, (D2)

  48. strcpy biblioteksrutin i C char *strcpy(char *destination, const char *source); char *strcpy(char *dest, const char *src) { unsigned i; for (i=0; src[i] != '\0'; ++i) dest[i] = src[i]; dest[i] = '\0'; return dest; } IS1200 Datorteknik ht2009 föreläsning 5, (D2)

  49. strcpy biblioteksrutin i C char *strcpy(char *destination, const char *source); char *strcpy(char *dest, const char *src) { char *save = dest; while(*dest++ = *src++); return save; } IS1200 Datorteknik ht2009 föreläsning 5, (D2)

  50. strncpy biblioteksrutin i C char *strncpy(char *s1, const char *s2, size_t n); DESCRIPTION The strncpy() function copies not more than n bytes (bytes that follow a null byte are not copied) from the array pointed to by s2 to the array pointed to by s1. If copying takes place between objects that overlap, the behaviour is undefined. If the array pointed to by s2 is a string that is shorter than n bytes, null bytes are appended to the copy in the array pointed to by s1, until n bytes in all are written. RETURN VALUE The strncpy() function returns s1; no return value is reserved to indicate an error. IS1200 Datorteknik ht2009 föreläsning 5, (D2)

More Related