Dagens tema: Tallsystemer (P&H: 4.1 4.2) Generelt Binære, oktale og heksadesimale tall Tall, bit og byte Negative tall Assemblerspråk (P&H: 3.1 3.3 + A.9) Datamaskinens oppbygging Enkel aritmetikk Flytting av data Programmene spim og xspim Mål Kunne kjøre sitt første assemblerprogram Husk! Les beskjedene på kursets hjemmeside. Ark 1 av 25 Forelesning 31.1.2001
Eksempelet fra forrige uke #include <stdio.h> #include <stdlib.h> int main(void) { FILE *f; int nc[256], i, c; for (i = 0; i <= 255; ++i) nc[i] = 0; f = fopen("min.fil","r"); if (f == NULL) { printf("kan ikke lese min.fil!\n"); exit(1); } c = fgetc(f); while (c!= EOF) { ++nc[c]; c = fgetc(f); } fclose(f); for (i = 0; i <= 255; ++i) { if (nc[i] > 0) { if ((32<=i && i<=126) 161<=i) printf(" %c ", i); else printf("%3d", i); printf(":%4d\n", nc[i]); } } return 0; } Forelesning 31.1.2001 Ark 2 av 25
Posisjonelle tallsystemer I posisjonelle tallsystemer angir hvert siffers posisjon hvilken vekt det skal ha: 107 = 1 100 + 0 10 + 7 1 = 1 10 2 + 0 10 1 + 7 10 0 Her er grunntallet 10, men må det være slik? Ikke-desimale tallsystemer Tid angis i et 60-tallsystem: Klokken 10.27.49 På dansk (og fransk) lever ennå restene av et 20-tallsystem: «ni-og-halv-fems»: 9 + 4 1 2 20 = 99 Forelesning 31.1.2001 Ark 3 av 25
Gamle engelske hulmål økte med en faktor 2: 2 gills = 1 chopin 3dl 2 chopins = 1 pint 2 pints = 1 quart 2 quarts = 1 pottle 2 pottles = 1 gallon 2 gallons = 1 peck 2 pecks = 1 demibushel 2 demibushels = 1 bushel 2 bushels = 1 kilderkin 2 kilderkins = 1 barrel 2 barrels = 1 hogshead 2 hogsheads = 1 pipe 2 pipes = 1 tun 1160 l Forelesning 31.1.2001 Ark 4 av 25
Det binære tallsystemet Siden det er spesielt enkelt å lagre bit («binary digit») benyttes det binære tallsystemet i datamaskiner. I det binære tallsystemet er grunntallet 2 og sifrene 0 og 1. 0 ti 0 to 8 ti 1000 to 1 ti 1 to 9 ti 1001 to 2 ti 10 to 10 ti 1010 to 3 ti 11 to 11 ti 1011 to 4 ti 100 to 12 ti 1100 to 5 ti 101 to 13 ti 1101 to 6 ti 110 to 14 ti 1110 to 7 ti 111 to 15 ti 1111 to «Formel»: For en base Base er verdien av det i-te tallet d d Base i Norsk språkråd mener at det bør hete bit (med lang i). Forelesning 31.1.2001 Ark 5 av 25
Byte I en datamaskin kan man ikke operere med enkelt-bit; i stedet slås de oftest sammen i grupper på 8 og 8 kalt en byte. Her kan man lagre tall fra 0 til 255: 0 0 0 0 0 0 0 0 =0 ti 0 0 0 0 0 0 0 1 =1 ti. 1 1 1 1 1 1 1 0 = 254 ti 1 1 1 1 1 1 1 1 = 255 ti Ord På de fleste maskiner slår man også flere byte sammen til større enheter kalt ord («word»). På MIPS-maskiner er disse 4 byte eller 32 bit, og man kan da lagre tall opptil 4 294 967 295: 00000000000000000000000000000000 to =0 ti 00000000000000000000000000000001 to =1 ti. 11111111111111111111111111111110 to = 4 294 967 294 ti 11111111111111111111111111111111 to = 4 294 967 295 ti Ordet byte er et ordspill; bit kan bety en liten matbit, og da blir bite en hel munnfull. På norsk skal man helst bruke ordet oktett. Forelesning 31.1.2001 Ark 6 av 25
Hex-tall En ulempe ved binære tall er at de tar så stor plass når man skriver dem. Derfor benyttes ofte heksadesimale tall med grunntall 16 ved innlesning og utskrift. Man slår da sammen 4 og 4 bit; dette gir en verdi 0 15 som angis med et hex-siffer: 0, 1, 2,..., 9, A, B, C, D, E, F Dette er kun en notasjon som skal gjøre livet enklere for oss mennesker. Eksempel 10010011101 to = 0100 1001 1101 =49D hex Oktale tall Tidligere brukte man ofte oktale tall med grunntall 8. Her slår man sammen 3 og 3 bit. Forelesning 31.1.2001 Ark 7 av 25
C I programmeringsspråket C skriver man hexog oktale tall slik: 0x1A0 =1A0 hex 01765 = 1765 åtte Negative tall Man kan også lagre negative tall i det binære tallsystemet. Det vanligste formatet for dette heter toer-komplement («two s complement»). For å negere et tall, må man da gjøre følgende: 1. Snu alle bit-ene i tallet (0 1). 2. Legg til 1. Eksempel 13 ti = 0 0 0 0 1 1 0 1 13 ti = 1 1 1 1 0 0 1 1 Forelesning 31.1.2001 Ark 8 av 25
Tallområde Når man lagrer negative tall, kan man ikke lagre så store tall lenger. I én byte kan man for eksempel lagre tall mellom 128 og 127: 0 1 1 1 1 1 1 1 = 127 ti 0 1 1 1 1 1 1 0 = 126 ti. 0 0 0 0 0 0 0 1 =1 ti 0 0 0 0 0 0 0 0 =0 ti 1 1 1 1 1 1 1 1 = 1 ti. 1 0 0 0 0 0 0 1 = 127 ti 1 0 0 0 0 0 0 0 = 128 ti Fortegns-bit Man kan teste om tall lagret som toer-komplement er negative ved å se på det venstre bit-et. Det er alltid 0 for tall 0 og1for negative tall. Dette bit-et kalles derfor fortegns-bitet. Forelesning 31.1.2001 Ark 9 av 25
Tall med og uten fortegns-bit Hvordan vet maskinen om den har et stort positivt tall uten fortegns-bit, eller et negativt tall med fortegns-bit? Det vet den ikke! Vi må holde rede på slikt. Dette er typisk for programmering på maskinnært nivå: Maskinen lagrer og opererer på bit-mønstre. Alt ansvaret for fortolkning av bit-mønstrene ligger på programmereren. Av og til er det nyttig å tolke et bit-mønster på ulike måter. Forelesning 31.1.2001 Ark 10 av 25
Hva er en «computer»? Ordet computer var egentlig en yrkestittel. På 1930- og 40-tallet hadde man store saler hvor computere satt og regnet på bordregnemaskiner i henhold til arbeidsinstruks: 1. Gang 3.14159265 med 2.021. Skriv svaret i rute 221. 2. Hvis tallet i rute 221 er negativt, gå til punkt 17. 3. Gang tallet i rute 221 med 4 og skriv svaret i rute 222. Typiske oppgaver var å lage tabeller (sinus, logaritmer ol) og ballistiske analyser. Forelesning 31.1.2001 Ark 11 av 25
IN 147 Program og maskinvare Datamaskinens oppbygging Datamaskinen Eniac fra 1945 var 2½ 1 30 m, veide 30 tonn og inneholdt 18 000 radiorør. De første datamaskinene ble bygget over samme lest; de hadde Menneske Datamaskin «computer» Kontrollenhet Bordregner ALU Skriveark Hurtiglager Instruks Program («A LU» står for «arithmetic/logic unit».) Dagens maskiner er i hovedtrekk de samme. Forelesning 31.1.2001 Ark 12 av 25
Vårt bilde av en datamaskin ser altså slik ut: CPU RAM CPU («Central Processing Unit») er prosessoren. RAM («Random Access Memory») er maskinens hurtiglager, en samling byte. Mellom CPU og RAM er en buss med 8, 16 eller 32 ledere for data. Både programmet og data ligger i RAM; slike maskiner kalles «von Neumann»-maskiner. Forelesning 31.1.2001 Ark 13 av 25
Registre Dessuten finnes det noen lagerceller i selve prosessoren; disse kalles registre. MIPS har 35 slike: 32 mer eller mindre generelle registre kalt $0 til $31. $0 inneholder for eksempel alltid verdien 0. 2 spesielle registre til multiplikasjon og divisjon kalt hi og lo. Programtelleren kalt pc. Alle registrene har størrelse 4 byte (= 32 bit). Egentlig har den noen flere, men vi skal bare se på disse 35 i første omgang. Forelesning 31.1.2001 Ark 14 av 25
En datamaskin utfører operasjoner på en regneenhet i henhold til en kodet arbeidsinstruks. Denne arbeidsinstruksen kalles et maskinprogram og er kodet som bitmønstre. Eksempel Hva er 17 + 4? 00100000 00001000 00000000 00010001 00100000 00001001 00000000 00000100 00000001 00101000 01001000 00100000 Fordi slik kode er vanskelig å skrive og forstå for oss mennesker, er det definert et assemblerspråk som bare er en tekstlig koding av maskinspråket. En assembler oversetter fra assemblerspråk til maskinspråk. Eksempel addi $8,$0,17 addi $9,$0,4 add $9,$9,$8 Forelesning 31.1.2001 Ark 15 av 25
Assemblerspråk kontra høynivåspråk Det er en fundamental forskjell på høynivåspråk som C og Java, og et assemblerspråk som for eksempel MIPS-kode. I et høynivåspråk vet man ingenting om maskinens instruksjonssett, registre og lignende. Dette gjør programmene flyttbare. Man kan programmere raskere. I et assemblerspråk vet man nøyaktig hvilken maskinkode hver instruksjon blir oversatt til. Programmereren har full kontroll over maskinkoden. Forelesning 31.1.2001 Ark 16 av 25
RISC kontra CISC Det er to hovedretninger innen prosessorer i dag: CISC («Complex Instruction Set Computer») har mange instruksjoner (100 500) og mange varianter (1 20) av disse. Eksempler: Intel Pentium, Motorola 68040. Fordeler: Enklere å generere kode, både for programmer og mennesker. Mindre kode, både færre antall linjer og færre byte. RISC («Reduced Instruction Set Computer») har få instruksjoner (20 60) som til gjengjeld er meget raske. Eksempler: Sun Sparc, PowerPC, MIPS. Fordeler: Raskere kode. Enklere å lære for nybegynnere(?). I IN147 skal vi bruke RISC-prosessoren MIPS. Forelesning 31.1.2001 Ark 17 av 25
Enkel aritmetikk Alle prosessorer har en operator for addisjon. På MIPS heter den add: add res, reg 1, reg 2 Den setter registeret res til summen av de to registrene reg 1 og reg 2. Eksempel Hvis vi vet at $8 inneholder 17 og $9 inneholder 4, vil add $10,$8,$9 sette $10 til 21. Det finnes også en variant som summerer verdien i et register med en konstant: addi res, reg, lit (En konstant verdi kalles ofte en literal.) Forelesning 31.1.2001 Ark 18 av 25
Legge verdier i registre RISC-prosessorer trenger ingen egen instruksjon for å legge verdier i et register, siden man har addisjon og et register som alltid er 0 (nemlig $0). addi $11,$0,157 vil legge verdien 157 i register $11. Eksempel Følgende tre instruksjoner vil legge verdien 17 i $8 og 4 i $9 og så addere $8 til $9:.text addi $8,$0,17 addi $9,$0,4 add $9,$9,$8 (Direktivet.text forteller at det kommer programkode.) Forelesning 31.1.2001 Ark 19 av 25
Kjøring på xspim Vi kan simulere kjøring av denne koden ved hjelp av programmet xspim: xspim -file add-1.s (Det er vanlig i UNIX at filer med assemblerkode harnavnsomslutterpå.s.) Ved å sette programtelleren (registeret pc) til adressen til første programlinje, kan vi kjøre gjennom programmet én og én instruksjon. Det finnes også en versjon uten vinduer; den heter spim. Forelesning 31.1.2001 Ark 20 av 25
Forelesning 31.1.2001 Ark 21 av 25
Aritmetiske operasjoner MIPS har følgende operatorer for +,, og : add res, op 1, op 2 addu res, op 1, op 2 addi res, op 1, lit addiu res, op 1, lit sub res, op 1, op 2 subu res, op 1, op 2 mult op1, op 2 multu op1, op 2 div op1, op 2 divu op1, op 2 Instruksjoner hvis navn slutter på -u er beregnet på tall uten fortegns-bit, mens de andre brukes på tall med fortegns-bit. Forelesning 31.1.2001 Ark 22 av 25
Resultatet av en multiplikasjon er på 64 bit og havner i spesialregistrene hi og lo. Ved en divisjon plasseres svaret i lo og resten i hi. Ved hjelp av instruksjonene mfhi («move from hi») og mflo kan man flytte resultatet over i et vanlig register: addi $8,$0,1024 addi $9,$0,3 div $8,$9 mflo $10 mfhi $11 Nå skal innholdet av $10 være 341 og innholdet av $11 er 1. Forelesning 31.1.2001 Ark 23 av 25
Utskrift av tall i spim Simulatoren spim har en mulighet for å skrive ut og lese inn tall og tekster samt terminere kjøringen. Dette er altså noe som ikke finnes i MIPS-prosessoren, men bare i simulatoren! Følgende lille program skriver ut tallet 722 og avslutter:.text main: addi $2,$0,1 # Skriv tall. addi $4,$0,722 # Tallet er 722. syscall addi $2,$0,10 # Avslutt. syscall Forelesning 31.1.2001 Ark 24 av 25
Følgende er verdt å merke seg: syscall forventer å finne en kommandokode i $2. Koden for å skrive ut et heltall er 1. Parametre til syscall legges i $4. Alt etter en # på linjen betraktes som kommentar. Instruksjoner kan navngis ved å skrive et navn med : først på linjen. spim forventer at det finnes en main. Det lille programmet kan kjøres med kommandoen maskin navn> spim -file tall.s SPIM Version 5.8 of January 5, 1996 Copyright 1990-1994 by James R. Larus (larus@cs.wisc.edu) All Rights Reserved. See the file README for a full copyright notice. Loaded: /local/lib/spim/trap.handler 722 Forelesning 31.1.2001 Ark 25 av 25