760 likes | 945 Views
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
E N D
IS1200 Datorteknik Föreläsning 5 Maskinnära programmering med C IS1200 Datorteknik, föreläsning 5
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
Ö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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
- + 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
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
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
- + 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
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
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
- + 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
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
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
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
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
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
ptr-t Incrementing pointer i C-kod - + ptr ptr-+1 ptr ptr-+1 IS1200 Datorteknik, föreläsning 5
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
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
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
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
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
’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
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
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
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
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
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
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
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 (¤t_time); tick (¤t_time); delay (1000); } } IS1200 Datorteknik, föreläsning 5
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
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
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
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