TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 3 TSEA28 Datorteknik Y (och U) Föreläsning 2 Kent Palmkvist, ISY Praktiska kommentarer Labanmälan öppnar måndag 28/1 kl 12.30 Anmälningssystemet via Lisam Maila gärna mig vad som krångar om det krånglar Varje labb uppdelad i två delar (2h+2h), välj lämpligen två tillfällen med tid emellan Labsystemet ännu oklart (uppdatering pågår av vissa delar) Just nu: använder ISY:s gamla fileserver Annorlunda hemkonto än för det nya elevsystemet https://www.isy.liu.se/tus/handbook/faq.html TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 2 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 4 Dagens föreläsning Kort repetition Större programmeringsexempel Subrutiner Stack Adresseringsmoder Enkel exempeldator 2 register (PC och D), 1 ALU, kontrollenhet (CU) I/O: display och sensor minne Typ Argument 9 olika instruktioner xxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Kod Assemblerinstruktion Föklaring 4 32 PC 0 load D,#värde Ladda in argument i In Ut 1 add D,#värde Addera argument till D 2 comp D,#värde Jämför argument med D, Z=1 om D=argument, Z=0 annars CU 3 bne adress Sätt PC till argument om Z=0 4 beq adress Sätt PC till argument om Z=1 ALU 5 branch adress Sätt PC till argument 6 bl 2000 om argument = 2000 skicka D till display D Z 6 bl 2100 om argument = 2100 hämta aktuellt displayvärde till D 6 bl 2200 om argument = 2200 hämta sensorvärde till D, D=1 om någon I dörren 7 load D,adress Läs värde från minnesadress och placera i D 8 store D,adress Spara värdet I D I minnesadressen
TSEA28 Datorteknik Y (och U), föreläsning 1, Kent Palmkvist 2019-01-22 5 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 7 Räkna studenter start: load D,#0 ; Nollställ D store D,100 ; spara displayvärde adress 100 bl 2000 ; sätt display till 00 wait1: bl 2200 ; Hämta sensorvärde comp D,#1 ; Står någon i dörren? bne wait1 ;, gör om load D,100 ; hämta displayvärdet add D,#1 ; öka displayvärdet bl 2000 ; visa det nya värdet store D,100 ; spara nya värdet i minnet load D,#0 ; starta timer på 0 delay: add D,#1 ; öka timer med 1 comp D,#10000 ; lämpligt antal klockcykler? bne delay ; inte tillräckligt många varv wait0: bl 2200 ; Hämta sensorvärde comp D,#0 ; Är dörren tom? bne wait0 ;, kontrollera igen branch wait1 ; bör om Nollställ displayvärde Vänta på sensorvärde = 1 Öka displayvärde med 1 Vänta 0.5s Vänta på sensorvärde = 0 Beskriv funktionen som en sekvens av enklare funktioner Tänk igenom förväntad sekvens Ingen ide räkna upp medan dörren är stängd Rita lite fritt först, med stora komplexa instruktioner Nollställ när strömmen slås på Om dörr stängs räkna ned antal med 2 (måste passera dörren för att stänga den), vänta till dörren öppnas igen Räkna upp om dörrsensor aktiveras TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 6 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 8 Hur skriva större program Öka kraven i exemplet Lägg till en sensor för dörrlås (räkna inte när g går och hämtar kaffe...) Kräver ny instruktion för läsa dörrlås bl 2300 Läs dörrlås, D=1 om dörr stängd, D=0 annars Räkna upp varannan gång (måste gå in och ut ur kontoret) Automatisk nollställning varje natt (om dörr stängd > 8h nollställ) Behöver lite mer strukturerad metod Tänk igenom förväntad funktion, rita flödesscheman Detaljerad beskrivning Minnesceller Riktig assemblerkod, namnge platser, rensa upp Exempelstruktur (rita gärna flödesdiagram) Initiera vänta på aktivitet på dörr eller sensor om dörr öppen om sensor aktiv räkna upp, vänta tills passerat vänta på nästa aktivering (personen går ut) om dörr stängd minska räknare med 2 räkna tid tills dörr öppnas om tid > 8h nollställ räknaren
TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 9 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 11 Dela upp i mindre sekvenser Försök dela upp i små steg Varje litet steg bör kunna direkt översättas till maskinkod T ex: vänta på nästa aktivering (personen går ut) läs sensor, gå vidare om sensor aktiv, annars läs om igen vänta 0.5s läs sensor, gå vidare om sensor inte aktiv, annars läs om igen Ordna allt i en sekvens Har inte ritat ut val som går till nästa rad Initiera sensor aktiv? vänta 0.5s sensor aktiv? Räkna upp display med 1 sensor aktiv? vänta 0.5s sensor aktiv? Räkna ned display med 2 Räkna tid Tid > 8h? Nollställ display TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 10 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 12 Mer detaljerad beskrivning Initiera sensor aktiv? Räkna ned display med 2 vänta 0.5s Räkna tid sensor aktiv? Räkna upp display med 1 Tid > 8h? sensor aktiv? Nollställ display vänta 0.5s sensor aktiv? Funder över behov av minnesplatser D används till mycket Sensorvärden Räknarvärden Välj att placera räknarvärde i minnet Bestäm adresser för detta 3000: displayvärde 3001: tidräknare Kom ihåg att minnesceller kan ha slumpmässigt startvärde! Måste initiera! Initiera sensor aktiv? vänta 0.5s sensor aktiv? Räkna upp display med 1 sensor aktiv? vänta 0.5s sensor aktiv? Räkna ned display med 2 Räkna tid Tid > 8h? Nollställ display
TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 13 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 15 Ersätt med riktig assemblerkod Ersätt varje större instruktion med riktig assemblerkod Namnge all platser som ska hoppas till init: load D,#0 store D,3000 bl 2000 sens1: bl 2200 comp D,#1 beq 1 bl 2300 comp D,#0 beq sens1 branch decrement Initiera sensor aktiv? vänta 0.5s sensor aktiv? Räkna upp display med 1 sensor aktiv? vänta 0.5s sensor aktiv? Räkna ned display med 2 Räkna tid Tid > 8h? Nollställ display Hela programmet, del2 sens2: bl 2200 ; hämta sensorvärde comp D,#0 ; är sensor inaktiv? beq 1 ;, fortsätt nedan bl 2300 ; hämta låssensor comp D,#0 ; är dörren låst beq sens2 ;, testa sensor och lås igen branch decrement ; Ja, hantera i decrement-rutinen 1: load D,3000 ; räkna upp display add D,#1 ; räkna upp store D,3000 ; spara det nya värdet bl 2000 ; visa på display TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 14 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 16 Hela programmet, del1 init: load D,#0 ; initiera displayräknare till 0 store D,3000 ; sätt sparat displayvärde till 0 bl 2000 ; och sätt display till 0 sens1: bl 2200 comp D,#1 beq 1 ; hämta sensorvärde ; är sensor aktiv? ;, fortsätt nedan bl 2300 ; hämta låssensor comp D,#0 ; är dörren låst beq sens1 ;, testa sensor och lås igen branch decrement ; Ja, hantera i decrement-rutinen 1: load D,#0 ; vänta 0.5s wait0: add D,#1 ; räkna upp comp D,#1000 ; väntat färdigt? bne wait0 ;, vänta mer Hela programmet, del3 sens3: bl 2200 ; hämta sensorvärde comp D,#1 ; är sensor aktiv? beq 2 ;, fortsätt nedan bl 2300 ; hämta låssensor comp D,#0 ; är dörren låst beq sens3 ;, testa sensor och lås igen branch decrement ; Ja, hantera i decrement-rutinen 2: load D,#0 ; vänta 0.5s wait1: add D,#1 ; räkna upp comp D,#1000 ; väntat färdigt? bne wait1 ;, vänta mer
TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 17 Hela programmet, del4 sens4: bl 2200 ; hämta sensorvärde comp D,#0 ; är sensor inaktiv? beq sens1 ;, bör om bl 2300 ; hämta låssensor comp D,#0 ; är dörren låst beq sens4 ;, testa sensor och lås igen Subrutiner, stack decrement: load D,3000 ; hämta aktuellt displayvärde add D,#-2 ; minska med två store D,3000 ; spara det nya värdet bl 2000 ; visa på displayen load D,#0 ; nollställ tidräknare tidloop: add D,#1 ; öka tid store D,3001 ; spara tidvärde i minnet TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 18 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 20 Hela programmet, del5 bl 2300 comp D,#0 beq sens1 load D,3001 comp D,#80000 beq tidloop: load D,#0 store D,3000 bl 2000 branch tidloop ; hämta låssensor ; är dörren låst ;, bör om från börn ; har 8h passerat? ; fortsätt vänta ; nollställ displayvärde ; spara värdet I minnet ; visa på displayen ; nollställ tidräknare Återanvändning av kod Många likadana sekvenser i koden Fördröjning på 0.5s ser likadan ut på två ställen i koden 2: load D,#0 ; vänta 0.5s wait1: add D,#1 ; räkna upp comp D,#1000 ; väntat färdigt? bne wait1 ;, vänta mer Kan vara många flera rader i koden Lagra endast en kopia av sekvensen Återanvänd genom att hoppa till sekvensen från flera platser Kallas subrutin Samma idé som funktioner och procedurer i vanliga programspråk
TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 21 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 23 Subrutiner Program Subrutin, exempel Måste komma ihåg var programmet ska fortsätta efter subrutinen Återhopp 4 är har en annan adress än återhopp 2! Vanligt hopp fungerar inte (som måste ha fast adress) för återhoppet Spara adress till nästa instruktion när anrop till subrutin görs Speciell subrutinsinstruktion istället för vanligt hopp Den sparade adressen kan användas vid återhoppet (ytterligare en speciell instruktion) 2 anrop 1 anrop 4 3 Subrutin återhopp Programmet startar högst upp Vid 1:a bl sparas adress A (kopieras från PC till lr) och adress C placeras i PC När subrutin C är slut återställs det sparade värdet (adress A lagrad i lr) till PC Vid 2:a bl sparas adress B (kopieras från PC till lr) och adress C placeras i PC När subrutin C är slut återställs det sparade värdet (adress B lagrad i lr) till PC Exemplet klarar sig med ett enda register för återhoppsadress Fungerar inte om subrutiner kan anropa andra subrutiner (det gör dom...) bl C A: : bl C B: : C: subrutin TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 22 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 24 Subrutiner, forts. Vid anrop till subrutin bl adress ; hopp till subrutin som startar på adress i minnet Sparar adress till instruktion efter bl (finns i PC-registret innan hoppet) i ett register (kallat lr) När subrutin slut ; retur från subrutin Använd den sparade adressen från bl-instruktion (liggande i registret lr) och placera den i PC-registret Placering av den sparade återhoppsadressen? Ett speciellt register alternativt en speciell adress i minnet Subrutiner: rekursiva anrop, ett register Rekursion kräver möjlighet lagra flera anrop i rätt ordning Om bara ett register tappas första återhoppsadressen bort vid andra anropet Första bl => återhoppreg lr = A. Andra bl => återhoppreg lr = C (ersätter värdet A). Återhopp i subrutin D => återhopp till C Återhopp i subrutin B => återhopp till C FEL!!!... bl A:.... B: bl C: subrutiner D:
TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 25 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 27 Subrutiner: stöd för rekursiva anrop Rekursion kräver möjlighet lagra flera anrop i rätt ordning Spara gamla värdet i lr med push instruktion i en hög med tidigare värden innan bl skriver över med en ny adress Återställ lr med tidigare återhoppsadressen från högst upp i högen av gamla återhoppsadresser med instruktionen pop Denna datastruktur kallas för stack (last in first out) Jfr en låda med papper Värden läggs till högst upp, värden tas bort från toppen... push lr bl pop lr. push lr bl pop lr... push lr bl pop lr subrutiner Implementering av en stack, funktion Att placera något på stacken Kallas ibland för push, implementeras i flera steg Ändra SP till nästa lediga minnesadress Placera värdet i minnet på adress som finns i SP (SP pekar på) Att ta bort något från stacken Kallas ibland för pop, implementeras i motsatt ordning mot push Hämta värdet från minnet på den adress som finns i SP Ändra SP så den pekar på det nyaste översta värdet i stacken SP ökas eller minskas med 1 för varje push respektive pop operation TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 26 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 28 Implementering av en stack Att använda ett speciellt (dedikerat) minne inuti processorn för stack är ineffektivt Kan dock ge bättre prestanda i vissa fall Stacken använder sig av en del av minnet Måste hålla ordning på var aktuell position befinner sig (toppen på stacken) Ett speciellt register i processorn Kallas för stackpekare (SP) Stacken kan växa uppåt eller nedåt i minnet Kan ibland väls för processorn Utökning av exempeldatorn med stack Adress till minne måste styras med PC, SP och CU PC för nästa instruktion CU för adress från argument i instruktionen SP för läsa/skriva till stacken Måste initiera SP innan den används! Måste finnas skrivbart minne på adresserna Alternativ 1: sätt SP vid reset (spänningspåslag) till ett förbestämt värde Alternativ 2: Sätt SP i programmet Kräver ny instruktion: load SP,#adress Eventuellt extra push D och pop D instruktioner In minne PC ALU D Z CU SP Ut
TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 29 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 31 Grafisk beskrivning av minnesinnehåll Program ökar PC med 1 för varje instruktion Naturligt skriva lägst adress högst upp (nästa instruktion under föregående instruktion i listan) Låga adresser skrivs längst upp, höga adresser skrivs längst ned Kan ibland bli lite motsägelsefullt Om någon växer, ökar eller minskar adressen? Används i kursen Ibland ritas minneskarta med omvänd adressordning Låga adresser längst ned, höga adresser längst upp 96 xxx 97 xxx 98 xxx 98 xxx 97 xxx 96 xxx Program växer nedåt (mot högre adresser) Program växer uppåt (mot högre adresser) Exempel på sekvens av stackoperationer 1: SP = 98 Okänt innehåll (xxx) i minnet 2: Push(34) SP = 97 Minne[97] = 34 3: Push(19) SP = 96 Minne[96] = 19 4:D=pop() D = Minne[96] = 19 SP = 97 5:D=pop() D = Minne[97] = 34 SP = 98 96 xxx 97 xxx SP 98 xxx SP SP 96 xxx 97 34 98 xxx SP 96 19 97 34 98 xxx 1 2 3 96 19 97 34 98 xxx SP 96 19 97 34 98 xxx 4 5 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 30 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 32 Alternativ för stackimplementering Stack kan växa uppåt eller nedåt Mer vanligt att stacken växer mot lägre adresser (nedåt) Program växer i storlek mot högre adresser => stack växer från andra hållet Förhoppningsvis möts de aldrig!! SP kan peka på första lediga plats eller senast placerade data Valet påverkar om SP ändras före eller efter att data lagts på stacken ARM: Stack växer mot lägre adresser, pekar på senast placerade data 96 xxx 97 xxx SP 98 xxx 96 xxx 97 xxx SP 98 xxx Växer nedåt (mot lägre adresser) Växer uppåt (mot högre adresser) Subrutinanrop alt. 1: utan stack Extra register enbart avsett att lagra PC vid subrutinanrop LR: Link register bl subrutinadress ; Hopp till subrutin LR = adress till instruktion efter bl (dvs PC-registrets värde) PC = subrutinadress ; Återhopp vid slut på subrutin PC = LR Subrutinen måste själv spara undan LR:s nuvarande värde innan nästa bl (t ex på en stack)
TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 33 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 35 Subrutinanrop alt. 2: automatisk stack Kombinera push och bl i en enda instruktion, respektive och pop i en instruktion jsr subrutinadress Push(PC), dvs adress till instruktion efter jsr PC = subrutinadress Rts ; Återhopp vid slut på subrutin PC = pop() En subrutin kan anropa sig själv Rekursion, exempelvis n! beräknad rekursivt nfak(n): if N = 1 then return 1 else return nfak(n-1)*n; För många anrop gör att stacken blir för stor (SP -> 0 eller SP pekar på annan viktig data, t ex programmet) En detalj; hopp i koden Skillnad mellan branch och jump Brukar finnas både jump och branch Även möjligt med BSR och JSR (branch respektive jump subroutine) Jump: Adressen i argumentet är absolut adress Exakt den adress som PC ska få när hoppet är utfört Branch: argumentet är en offset mot aktuell PC Argumentet anger hur många steg framåt eller bakåt hoppet ska göras relativt aktuellt adress i PC Fördel: hopp inom rutinen behöver inte ändras även om rutinen placeras på annan plats i minnet TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 34 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 36 Jämförelse jsr med/utan stack Fördel automatisk stack (68000, x86 mfl) Enklare programmera Färre instruktioner i subrutinerna Behöver inte extra instruktioner för att spara undan och hämta LR på stacken Behöver inte extra instruktioner för hantering av LR registret Fördel utan automatisk stack (ARM mfl) Snabbare instruktion Behöver inte spara onödiga adresser på stacken behöver inte läsa från minnet vid återhopp Användning av bl i exempeldatorn bl är subrutinanrop som gömmer koden för hur sensorer och display hanteras Någon måste fortfarande skriva rutinerna och bygga in gränssnittet i datorn Dessa subrutiner är exempel på olika I/O-funktioner Skicka ut data till display Läsa av sensor och låssensor Hur? Måste finnas en del i modelldatorn där display och sensorer kan anslutas, och data kan skickas in/ut
TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 37 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 39 In och utdata, speciella instruktioner Vissa datorer använder speciella instruktioner för att skicka och ta emot data från I/O Kräver extra instruktioner såsom in D,ioadress out D,ioadress ; läs av inport nr ioadress och spara i D ; skicka värde i D till utport på adress ioadress Kräver extra signaler ut från processorn (styrsignaler) Datasignaler (värdet) skickas samma väg som data till/från minnet In och utdata påverkar inte tillgänglig mängd minne Out D,100 skriver INTE i minne adress 100 Eget adressutrymme för I/O separat från vanligt minne Exempel avkodning minnesmappad I/O Vill ha en I/O-port på adress 0x1234 dvs 0001 0010 0011 0100 binärt Alternativ 1: fullständig avkodning Alla 16 bitarna måste undersökas Kräver stort logiskt nät för att avgöra om I/O-adress avser denna port Alternativ 2: Använd färre bitar (t ex strunta i de 4 sista bitarna) Porten hamnar på alla adresser 0x123x, dvs 0001 0010 0011 xxxx Skrivning på 0x1234 är samma som 0x1230 Går snabbare och tar mindre hårdvara att avkoda TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 38 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 40 In och utdata, minnesmappad I/O Vissa datorer (dom flesta) använder speciella minnesadresser för att ta emot data från I/O Kräver inga extra instruktioner Enkelt hantera i högnivåspråk (t ex C/C++) Kräver att vissa minnesadresser inte kan användas som vanligt minne Avkoda adressen Ibland avkodas inte signalen fullständigt => Samma enhet på flera adresser Datasignaler (värdet) skickas samma väg som data till/från minnet ; display finns på adress ; 65532, sensor på 65534 putdisplay: ; adress 2000 store D,65532 readsensor: ; adress 2200 load D,65534 Instruktioner så här långt Olika typer av instruktioner finns Flytta data load, store Beräkna nya värden (addera, jämför), påverka Z-flagga add, comp Ändra instruktionsföljd (hopp) bne, beq, branch, bl, Eventuella speciella funktioner In, out
TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 41 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 43 Närmare beskrivning av olika load Många olika load instruktioner har angetts så här långt (samma mnemonic, olika typ, olika kodning) load D,#värde load D,adress load SP,#värde Finns också instruktioner som liknar load Push D => store D,[-1,SP]! ; minska SP med 1, flytta D till adress ; som nya värdet på SP registret pekar på Pop D => load D,[SP+1] ; läs värde från minne på adress i SP, öka ; SP med 1. En dators ordlängd Hur långt är ett ord (antal bitar som ALU arbetar på)? 8-bitars processor: 8 bitars ordlängd (1 byte) Vanliga ALU operationer (add, cmp, or etc.) arbetar med 8 bitar per gång Ofta 16-bitars adressrymd (65536 olika adresser) 16-bitars processor: 16 bitars ordlängd (word = 16 bitar, byte = 8 bitar). Vanliga ALU operationer arbetar med 16 eller 8 bitar per gång 16 eller möjligen 32-bitars adressrymd TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 42 TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 44 Olika sätt att beskriva adressering Omedelbar (immediate, literal) load D,#värde ; argumentet är värdet Direkt (absolut) load D,adress ; argumentet är adressen i ; minnet där värdet finns Offset load [SP,#4],D ; spara i minnet på den adress ; som fås om 4 läggs till värdet i SP Indirekt med predecrement push D => store D,[SP,#-4]!; adressen fås från ett register ; som först räknas ned med 4 Indirekt med post increment pop D => load D,[SP],#4 ; adressen fås från ett register som ; sedan räknas upp med 4 Instruktion Register D Instruktion Register D Minne Många fler moder är möjliga (register indirekt, postdecrement etc.) Minne Register D Register SP 4 + Register D Register SP 4 - Minne Minne En dators ordlängd, forts. Hur långt är ett ord (antal bitar som ALU arbetar på)? 32-bitar processor: 32 bitars ordlängd (word = 32 bitar, halfword = 16 bitar, byte= 8 bitar) Vanliga ALU operationer arbetar med 32, 16 eller 8 bitar per gång I vissa arkitekturer kallas ordlängderna istället long = 32 bitar, word = 16 bitar, byte = 8 bitar 32 bitars ardressrymd (4 Gigabyte minne) 64-bitar processor: 64 bitars ordlängd 64 bitars adressrymd Labbmaskinen (ARM) är en 32-bitars processor Finns numera även 64-bitars ARM processorer (t ex i Rpi 3)
TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 45 Minnesadresering Minne beskrivs oftast som en vektor av byte Adress väljer vilken byte som ska läsas/skrivas Även datorer som hanterar längre ordlängd har minnet beskrivet som array av byte Fysiskt kan minnet beskrivas som en annan ordlängd T ex 64-bitar i en äldre PC som har en 32-bitars processor Även 16, 32 och 64-bitars processorer beskriver oftast minnet som en uppsättning byte Kan vara begränsad till att alltid ha adresser som är jämnt delbara med 2 eller 4. Adress 00 01 02 03 04 05 8 bitar www.liu.se TSEA28 Datorteknik Y (och U), föreläsning 2, Kent Palmkvist 2019-01-22 46 Hur många bitar innehåller en adress? Ofta kan 32-bitars data kan hämtas vid en läsning 4 stycken adresser med 8 bitar var läses på en gång Adressen som anges pekar på 1:a byte som ska läsas I många fall kan man inte läsa 16 och 32-bitar från udda adresser LSB (Least significant bit/bits) i adress alltid = 0 Ex: Läs 32-bitar adress 4 går bra, läs 32-bitar på adress 10 går inte (2 olika adresser måste läsas efter varandra) Adress 00 04 08 12 16 20 32 bitar