Digital kommer från latinets digitus som betyder "finger" eller "tå" (jfr engelskans digit). Uttrycket kommer från den gamla seden att räkna på fingrarna, och avslöjar att det rör sig om räkning med diskreta storheter. Digitalteknik och Datorarkitektur 5hp Föreläsning 6: aritmetik onsdag 15 april 2008. karl.marklund@it.uu.se Digital information kan kopieras och överföras med perfekt resultat varje gång. Detta till skillnad från analog information, som alltid påverkas mer eller mindre vid varje överföring. Hur borde Musse och hans fyrfingrade kompisar skriva talet 127 10? Jo, självklart vore det smidigast för mig med talbas åtta, dvs oktalt. I det oktala talsystemet har vi siffrorna 0, 1, 2, 3, 4, 5, 6, 7 Hur många bilar kan finnas registrerade? NUV 647E 177 8 = (7*8 0 7*8 1 1*8 2 ) 10 = (7 56 64 ) 10 = 127 10 Men durå Pluto... Hur borde du skriva 127 10? Varje bit kan vara antingen 0 eller 1, dvs 2 stycken olika möjligheter. Om vi lägger till en bit så kan även den vara antingen 1 eller noll. Totalt har vi alltså 2*2 stycken olika möjligheter. 2*2*2 = 8 möjliga värden. 3x12 = 36 2x12 = 24 1x12 = 12 0x12 = 18 32 bitar 2*2*2*2...*2 = 2 32 olika möjliga värden. 1
0x39383700 Heltal 59985408 10 Sträng 987 Instruktion xor $24, $9, 0x3700 Vi börjar med heltal. Flyttal 0.756809651851654052734375 All interpretations are valid. You have to explicitly tell the machine which interpretation you want. Use an integer load (lw) to interpret is as an int Use a floating point load (l.s) to interpret it as a float. Use a branch or a jump (bne or j) to interpret is as an instruction. Sign and Magnitude Vi tycks inte klara oss utan negativa heltal. Mest signifikanta biten anger tecken. 000 001 0 1 Hmm... På detta sätt får vi ju två stycken olika represenationer av noll: 0 och -0. 0 positivt 010 011 2 3 1 negativt 100-0 101-1 Hur kan vi representera negativa tal binärt? 110 111-2 -3 Hur funkar det att räkna med sign & magnitude? 0 1 0 (2) 1 1 1 (-3) Knasigt... Vi prövar med två två stycken 3-bitars tal med sign och magnitude. ------- 1 0 0 1 (1)...ser på signbitarna att talen har olika tecken, dvs vi skall egentligen subtrahera... 0 1 0 (2) 1 1 1 (-3) ------- 1 0 0 1 (1) Resultatet blir fyra bitar, dvs overflow! 3-bitars-resultatet blir 1... kan oxå se vilket tal som har störst magnitude (absolutbelopp). I detta fall -3 = 3 > 2 = 2 Alltså skall resultatet bli negativt. 1 1 (3) 1 0 (2) Lägg på tecken bit 101 (-1) - ----- 0 1 (1) 2
Sign & magnitude ger upphov till en mängd olika fall vilket blir komplext att implementera i hårdvara. Vårt exempel: (2) (-3) = -(3-2) = -1 Operation (A) (B) (A) (-B) (-A) (B) (-A) (-B) (A) - (B) (A) - (-B) (-A) - (B) (-A) - (-B) ADD Magnitude s (A B) -( A B) (A B) -( A B) A > B (A B ) -(A B ) (A B ) -(A B ) SUBTRACT Magnitudes A < B -(B A ) (B A ) -(B A ) (B A ) A = B (A B ) (A B ) (A B ) (A B ) Alternativ till Sign and Magnitute Mest signifikanta biten anger tecken. 0 positivt 1 negativt 000 001 010 011 100 101 110 111 0 1 2 3-4 -3-2 -1 Aha... På detta viss har vi exakt en representation av 0. -4 representerat men inte 4 Detta system kallas för 2-komplement. 3-bitar 100-4 = -2 2 0 101-3 = -2 2 1 110-2 = -2 2 2 = -2 1 0 111-1 = -2 2 3 = -2 1 1 4-bitar 1000-8 = -2 3 1001 1010-7 = -2 3 1-6 = -2 3 2 Vi testar detta i SPIM. addi $t0, $zero, -3 0xfffffffd 0xf = 1111 2 0xd = 1101 2 1111 1111 1111 1111 1111 1111 1111 1101 2 = -1*2 31 2 30 2 29... 2 3 01 = -3 = -1*2 2 1 = -3 Egenskaper för 2-komplement X = 1011 X = 0100 X X = 1111 = -1 (decimalt) X = X = 1010 X X = 1111 = -1 (decimalt) X X = -1 X 1 = -X Exempel: X = 6 10 = 0110 2 X 1 = -X 1111 1001 (X) (1) ------------ 1111 1010 Hur representeras -6 med hjälp av 2-komplement? -X = -6 10 = 1111 1010 2 (2-komplement) 3
3 6 = 3 (-6) 0011 (3) 1111 1010 (-6) ------------ 1111 1101 (-3) (-4 1) Subtraktion sker genom vanlig binär addition när vi använder 2-komplement -3 7 = -10 Funkar även för subtraktion av negativa tal. 000 001 010 011 100 101 110 111 signed 0 1 2 3-4 -3-2 -1 unsigned 0 1 2 3 4 5 6 7 Om vi tolkar dessa bitmönster som tal utan tecken (unsigned) är alla tal som är negativa om vi tolkar dem med tecken (signed) större än alla som är possitiva tolkade som tal med tecken. 1111 1101 (-3) 1111 1001 (-7) ------------ 1111 0110 (-10) (-16 6) Exempel: Om vi har en array med N element indexerade från 0 till N-1 Innan vi indexerar oss i arrayen med index i behöver kolla: Nu drar vi till med ett riktigt stort tal och ser hur SPIM hanterar det. 0 i < N Vi måste göra två jämförelser. Om i negativt i> unsigned N För den andra jämförelsen vet vi att i är possitivt och då spelar det ingen roll om vi använder signed eller unsigned. Vi spar en instruktion genom Index In Bounds i < att utnytja unsigned N egensakperna hos 2-komplement. addi $t0, $zero, 0xffffffff addi $t0, $t0, 1 sltu $t2, $t0, $t1 Set Less Than Unsigned: sltu Maskinkod 0x2008ffff, dvs op 2, regeistr 0 och 8 och en immediate konstant 0xfffff på 16 bitar vilket oxå är -1. blir resultatet noll Assemblator löser detta åt oss genom att inse att 32 st ettorärsammasaksom-1 addi har bara plats för en 16-bitar stor konstant och 0xffffffff är 32-bitar. eftersom -1 1 = 0. Närvi adderarettså 4
Ok... Då försöker vi med en något mindre men fortfarande stor immediate konstant. Den minsta negativa konstanten är 1000 2 = 0x8000. Immediate value (65535) out of range (-32768..32767) addi $t2, $zero, 0xffff Den största possitiva konstanten är 0111 1111 1111 1111 2 = 0x7fff. Orsaken är att vi försöker med den possitiva konstanten 1111 1111 1111 1111 2 som tar 16 bitar. Men, alla tal är signed så vi behöver en 17e 0-bit för tecknet och det får inte plats. Load Upper Immediate: lui lui addi $t2, 0x7fff $t3, $t2, 0x7fff $t2 0x7fff $t3 0x7fff7fff 0111 1111 1111 1111 0111 1111 1111 1111 2 (0x7fff7fff) OR 1000 2 (0x8000) -------------------------------------------- 0111 1111 1111 1111 1111 1111 1111 1111 (0x7fffffff) Vad händer om vi utför denna instruktion? Det strörsta possitiva 32-bitars talet. ori $t4, $t3, 0x8000 $t4 0x7fffffff Vad som gått galet går att utläsa från Cause-registet. Det speciella registret EPC (Exeption Program Counter) lagrar adressen till den felande instruktionen Om vi fortsätter att simulera programmet kommer det lilla operativsystem i SPIM att skriva ut ett felmeddelade. Programräknaren hoppar sedan till en speciell adress. På denna adress hittar vi operativsystemet som får ta han om problemet. Hårdvaran upptäcker att resultatet av additionen inte får plats på 32 bitar. Vi kommer att kika mer på exceptions och interrupts senare under kursen, 5
Hundratals Flera miljoner En transistor Multiplikation är faktiskt svårare än addition. register a 5 bit 32 bit register b 5 bit register c 5 bit add rd, rs, rt addi rd, rs, imm sub rd, rs, rt subi rd, rs, rt ;vers tt till maskinkod Registers 32 bit 32 bit ALU OP En NANDgrind n n multiplicand multiplier partial product array double precision product seq rd, rs, rt ALU 2n = 2 = 5 1010 = 10 = 2 = 5 1010 = 10 Least significant bit == 1 = 2 = 5 1010 = 10 = 2 = 5 1010 = 10 add multiplicand to product After the addition 6
= 2 = 5 1010 = 10 = 2 = 5 1010 = 10 0100 Shift After Shift = 2 = 5 1010 = 10 0100 = 2 = 5 1010 = 10 1000 Least significant bit == 0 Do not add multiplicand shift After shift = 2 = 5 1010 = 10 1000 = 2 = 5 1010 = 10 1000 Least significant bit == 1 multiplicand to product 7
= 2 = 5 1010 = 10 1000 = 2 = 5 1010 = 10 1000 1010 After the addition 1010 Shift = 2 = 5 1010 = 10 = 2 = 5 1010 = 10 1010 After Shift 1010 Least significant bit == 0 Do not add multiplicand = 2 = 5 1010 = 10 Optimera... n n multiplicand multiplier partial product array Can be formed in parallel and added in parallel for faster multiplication. double precision product 2n 1010 Aha! Multiplicera med 32 = 2 5 Final result: 000 1010 2 = 10 10 Done after 3 shifts 1378 * 32 kompilator 1378 << 5 (shift left 5) 8
Π = 3.141592... E = 2.718228... 1/3 = 0.33333... Speed of light 2.99792458*10^8 Binärt 0.1 2 0.01 2 0.001 2 Vi har hittils studerat hur vi kan representera heltal. Vi har aven studerat hur vi kan addera och subtrahera heltal. 1*2-1 = 1/2 = 0.5 Decimalt 1*2-2 = 1/4 = 0.25 1*2-3 = 1/8 = 0.125 5/8 = 0.625 = flyttal Men om vi vill dividera 5 med 8 Hur representerar vi 0.625 10 binärt? 0.625 = 0.5 0.125 = 1/2 1/8 = 0.101 2 MIPS Floating numbers (IEEE 754) 1 8 23 sign exponent fraction http://www.h-schmidt.net/floatapplet/ieee754.html (-1) sign (exponent - 127) x (1fraction) x 2 Vad händer om denna bit s tts till ett? Om den sista biten i exponenten flippas får vi 1.25 10 exempel -127 128 Skriv om så att talet börjar med en etta före den binära fixpunkten. 0.75 10 = 0 0.5 0.25 = ½ ¼ = 0.11 2 Normalisera 0.11 2 = 1.10 2 x (2-1 ) 10 Nu kan vi skriva -0.75 10 som (-1) 1 (126-127) x (1 0.1000...0) x 2 101111110100 = -0.75 10 Sign bit Exponent () Fraction (23 bit) -1 126 = 0111 1110 2 0.625 = 0.5 0.125 = 1/2 1/8 = 0.101 2 =1.01 2 *2-1 126 127 = -1 0.10 10 = 1/16 1/32 1/256 1/1024... = 0.100110011... 2 During the Gulf War in 1991, a U.S. Patriot missile failed to intercept an Iraqi Scud missile, and 28 Americans were killed. A later study determined that the problem was caused by the inaccuracy of the binary representation of 0.10. The Patriot incremented a counter once every 0.10 seconds. It multiplied the counter value by 0.10 to compute the actual time. However, the (24-bit) binary representation of 0.10 actually corresponds to 0.099999904632568359375, which is off by 0.00095367431640625. This doesn t seem like much, but after 100 hours the time ends up being off by 0.34 seconds enough time for a Scud to travel 500 meters! 9