TSEA28 Datorteknik Y (och U) Föreläsning 5 Kent Palmkvist, ISY TSEA28 Datorteknik Y (och U), föreläsning 6, Kent Palmkvist 2017-01-23 2 Dagens föreläsning 68000 (Tutor) Adresseringsmoder M68008 stackhantering Exempel Stackhantering lämplig struktur på program I/O Vanliga fel I/O via PIA på tutor
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 3 Praktiska kommentarer Labanmälan finns tillgänglig Kursrummet på lisam, nere till vänster Lab 1 del A deadline anmälan 170130, kl 23.30 Tips: Börja läsa igenom labbmaterial redan nu Bra att vara förberedd innan 1:a lektionen Vi räknar inte med att ni kan processorbeskrivningen utantill, men att ni vet var man hittar den informationen i manualen TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 4 Praktiska kommentarer, forts. Användandet av tutor för labförberedelser ISY:s labbsalar/maskiner (asgård, olympen, egypten, southfork) Alla är öppna dygnet runt, men kan vara bokade för annan undervisning (kolla schemaservern!) Logga in först på ixtab.edu.isy.liu.se Se kurshemsidan för mer information Programsnuttar (t ex från individuella förberedelseuppgiften) innehåller inget avslut När programmet är slut fortsätter datorn tolka instruktionerna som kommer Se till att lägga till brytpunkt eller anrop till trap #14 Notera: utskrivna registervärden i samband med trap #14 är inte korrekta
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 5 Praktiska kommentarer, forts. Glöm inte den individuella hemuppgiften Efter dagens föreläsning bör ni kunna börja studera 1:a hemuppgiften Hemuppgift innan lab 1 består i att förstå ett redan givet program Ni ska förstå vad som händer med registervärden Glöm inte att ni kan simulera program på labbsystemet, även hemifrån (logga in på ixtab.edu.isy.liu.se) Individuell förberedelseuppgift 1 måste vara klar innan 1:a labben! Inte obligatorisk för vanliga labbtillfällen Krävs för att få tillgång till eventuella extratillfällen Se hemuppgift på hemsida (meny till höger) Lab3 har ingen individuell förberedelseuppgift TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 6 Register i 68000 D0 till D7 32-bitars dataregister A0 till SR PC 32-bitars adressregister, används som stackpekare (SP) 16-bitars statusregister med flaggor (+ statusbitar) 31 1615 87 0 D0 D1 D2 D3 D4 D5 D6 D7 31 1615 0 A0 A1 A2 A3 A4 A5 A6 PC SR 32-bitars programräknare, 20 bitar används till adresser
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 7 Datastorlek 68000 kan skriva och läsa 8, 16 och 32 bitars data Noteras i assembler genom tillägg av.b,.w och.l efter instruktion Exempel move.l #$ffffffff,d0 add.b #$11,d0 add.w #$1111,d0 ; sätt d0 = $ffffffff ; d0 = $ffffff10 ; Påverkar endast lägsta 8 bitarna! ; Ingen carry från bit 7 till bit 8! ; d0 = $ffff1021 ; Påverkar endast de lägsta 16 bitarna! add.l #$11111111,d0 ; d0 = $11102132 ; Påverkar alla bitar i registret TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 8 Minnesaccess Antag minnet innehåller (byte-adresserbart) $7: $8: $41 $9: $45 x är samma värde som $A: $4A innan instruktionen exekverades $B: $21 V move.b $8,d0 ; d0 innehåller nu $xxxxxx41 move.w $8,d1 ; d1 innehåller nu $xxxx4145 move.l $8,d2 ; d2 innehåller nu $41454121 Mest signifikant byte lagras först (lägsta adressen) Beskriv minnesaccess på adress A som M[A] move.w $8,d1 ; {M[8],M[9]} flyttas till d1 bit 15-0
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 9 Adresseringslägen, generellt Varje instruktion har ett antal in och utdata T ex Reg0 = reg1 + reg2 ; Reg1 och Reg2 indata, Reg0 utdata Vissa processorer antar alltid samma utdata (t ex 8- bit 6502 från Apple II) T ex svaret hamnar alltid i register A Behöver inte ange att A är källa Exempel: ADC #3 ; underförstått A = A + 3 Andra processorer tillåter olika in och utdataregister Exempel ARM Cortex-A: Add R0,R1,R2 ; R0 = R1 + R2 Ordning på register olika för olika processorfamiljer (vad som är källa respektive destination) TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 10 Adresseringslägen, 68000 I 68000 finns bara två parametrar till de flesta instruktionerna Destination för en operation är en av inparametrarna Se kapitel 6.2 i tutormanualen för mer info om adresseringslägen Register Operanden ligger i ett register add.b d0,d1 ; d1 = d1 + d0 Omedelbar Operand följer direkt på instruktionen add.b #15,d0 ; addera 15 till d0
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 11 Adresseringslägen, 68000, forts. Absolut Operanden ligger i minnet på angiven adress Add.w $8,d0 ; lägg till {M[8],M[9]} till d0 Kuriosa Det finns två olika absoluta adressversioner 32 bitar absolut adress: Kan peka på valfri adress i hela adressrymden 16 bitar absolut adress (2-komplement): Kan bara peka på lägsta adresserna (000000-007FFF) och högsta adressområdet ($FFFF8000-$FFFFFFFF) Den korta versionen kräver färre minnesceller för att lagra instruktionen (kan väljas av assemblern ibland) TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 12 Adresseringslägen, 68000, forts. 2 Registerindirekt addressering Operanden ligger på den adress som register pekar på add.b (a0),d0 ; addera M[A0] till d0 Registerindirekt addressering med förskjutning Operanden ligger på den adress som fås om förskjutning läggs till registrets värde add.b 6(a0),d0 ; Addera M[A0+6] till d0 Väldigt vanlig adresseringsmod i kompilerad kod Exempel: A0 pekar på datastruktur, och element på förskjutning 6 läses. Förskjutning är i 2-komplement Kan referera både framför och bakom adress pekad på av A0 i exemplet n n+1 n+2 n+3 n+4 n+5 n+6 A0 A0+6
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 13 Adresseringslägen, 68000, forts. 3 Registerindirekt adressering, postinkrement Använd adressregister, därefter ökas adressregister add.b (a0)+,d0 ; d0= M[a0] + d0, därefter a0 = a0 + 1 add.w (a0)+,d0 ; d0= {M[a0],M[a0+1]} + d0 därefter a0 = a0 + 2 add.l (a0)+,d0 ; d0= {M[a0],M[a0+1],M[a0+2],M[a0+3]} + d0, därefter a0 = a0 + 4 Observera a0 increment baseras på datastorlek (1,2, eller 4) Registerindirekt adressering, predecrement Minska först adressregister, använd därefter minnet add.b -(a0),d0 ; minska a0 med 1, addera M[a0] till d0 Minskning beror på datastorlek Nya värdet på a0! TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 14 Adresseringslägen, 68000, forts. 4 Vilka behöver man kunna? Direkt (ladda konstanter) Omedelbar (läsa/skriva från speciell adress) Registerindirekt (använda A-register som pekare) Registerindirekt Increment/decrement (för push/pop på stack) Alla andra går att lösa mha beräkning i A och D register Dock mindre effektivt
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 15 Stackhantering i 68000 är stackpekare Pekar på översta element i stacken Push XX implementeras som move.? XX,- (a7)? motsvarar.b,.w eller.l XX = Pop implementeras som move.? (a7)+,xx Exempel motsvarande push d0 move.w d0,-(a7) ; minska a7 med 2, därefter {M[a7],M[a7+1]} = d0 Specialfall (bara a7): push/pull byte (.b) minskar/ökar stackpekare a7 med 2! 0 1 n n+1 n+2 n+3 Minne Stackpekare a7 måste innehålla jämn adress TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 16 Subrutinanrop Använder automatiskt a7 a0-a6 kan också användas stackpekare, men används inte av jsr och rts Minnesceller ovanför stackpekaren a7 (lägre adresser) kan ändras i samband med exekvering Subrutinanrop som görs påverkar stacken Kan inte förvänta sig hitta gamla värden som lagts på stacken, kan ha skrivits över av andra rutiner I Tutor-miljön kommer minnescellen ovanför stacken få aktuell instruktionsadress om TR kommandot används I figur är värden i adresser n-1, n-2 (ovanför ) odefinierade (kan ändras) 0 1 n n+1 n+2 n+3 Minne
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 17 Exempel: stack och subrutiner Lite exempelkod ; Antagande. = 00, D1=345670 från start 001006 JSR.S 001050 001060 BNE.S 1058 Går igenom koden Exempel på hur man kan ta reda på funktion hos en given maskinkod 00 D0 xxxxxxxx D1 345670 00 PC 00 Z X TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 18 Exempel: stack och subrutiner, forts 1 ; Antagande. = 00, D1=345670 från start 001006 JSR.S 001050 001060 BNE.S 1058 Ladda D0 med 66 10 = 42 16 #66 inte noll => Z = 0 Räkna upp PC till nästa instruktion 00 D0 000042 D1 345670 00 PC 06 Z 0
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 19 Exempel: stack och subrutiner, forts 2 ; Antagande. = 00, D1=345670 från start 001006 JSR.S 001050 001060 BNE.S 1058 Kopiera återhoppsadress (nästa PC) till stack Minska med 4, sätt M[],M[],M[6ffe],M[6fff] Sätt PC till subrutinens adress 00 D0 000042 D1 345670 PC 50 Z 0 TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 20 Exempel: stack och subrutiner, forts 3 ; Antagande. = 00, D1=345670 från start 001006 JSR.S 001050 001060 BNE.S 1058 Pusha nuvarande D1-värde till stack Minska med 4, sätt M[],M[],M[6ffa],M[6ffb] 00 D0 000042 D1 345670 PC 52 Z 0
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 21 Exempel: stack och subrutiner, forts 4 ; Antagande. = 00, D1=345670 från start 001006 JSR.S 001050 001060 BNE.S 1058 Sätt D1 till 0 Värde = 0 => Z = 1 00 D0 000042 D1 000000 PC 58 Z 1 TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 22 Exempel: stack och subrutiner, forts 5 ; Antagande. = 00, D1=345670 från start 001006 JSR.S 001050 001060 BNE.S 1058 Beräkna D1 = D0 + D1 D1 =, D0 = $42 => D1 = $42 00 D0 000042 D1 000042 PC 5A Z 0
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 23 Exempel: stack och subrutiner, forts 6 ; Antagande. = 00, D1=345670 från start 001006 JSR.S 001050 001060 BNE.S 1058 Beräkna D0 = D0-1 D0 = $42 => D0 = $41 Sätt Z-flaggan till 0 (D0:s nya värde inte 0) 00 D0 000041 D1 000042 PC 60 Z 0 TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 24 Exempel: stack och subrutiner, forts 7 ; Antagande. = 00, D1=345670 från start 001006 JSR.S 001050 001060 BNE.S 1058 Om Z = 0 hoppa till 58 Z = 0 => PC = 58 00 D0 000041 D1 000042 PC 58 Z 0
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 25 Exempel: stack och subrutiner, forts 8 ; Antagande. = 00, D1=345670 från start 001006 JSR.S 001050 001060 BNE.S 1058 Beräkna D1 = D0 + D1 D1 = $42, D0 = $41 => D1 = $83 Resultat inte 0 => Z = 0 00 D0 000041 D1 000083 PC 5A Z 0 TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 26 Exempel: stack och subrutiner, forts 9 ; Antagande. = 00, D1=345670 från start 001006 JSR.S 001050 001060 BNE.S 1058 Loop address 58, 5A, 60 exekveras tills D0 = 1 lagts till D1 D1 blir totalt $42+$41+$40+...+$02+$01 = $08A3 Senaste SUB.L med D0 = 1 ger D0 = 0, Z = 1 00 D0 000000 D1 0008A3 PC 60 Z 1
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 27 Exempel: stack och subrutiner, forts 10 ; Antagande. = 00, D1=345670 från start 001006 JSR.S 001050 001060 BNE.S 1058 Om Z = 0 sätt PC till 58 Z = 1 därför blir PC = 62 (nästa instruktion) 00 D0 000000 D1 0008A3 PC 62 Z 1 TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 28 Exempel: stack och subrutiner, forts 11 ; Antagande. = 00, D1=345670 från start 001006 JSR.S 001050 001060 BNE.S 1058 Kopiera värdet i D1 till D0 D1 = $08A3 => D0 = $08A3 00 D0 0008A3 D1 0008A3 PC 64 Z 0
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 29 Exempel: stack och subrutiner, forts 12 ; Antagande. = 00, D1=345670 från start 001006 JSR.S 001050 001060 BNE.S 1058 Pop av värde tillbaks till D1 Kopiera M[],M[],M[6ffa],M[6ffb] till D1 Öka med 4 00 D0 0008A3 D1 345670 PC 66 Z 0 TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 30 Exempel: stack och subrutiner, forts 13 ; Antagande. = 00, D1=345670 från start 001006 JSR.S 001050 001060 BNE.S 1058 Återhopp från subrutin Kopiera M[],M[],M[6ffe],M[6fff] till PC Öka med 4 00 D0 0008A3 D1 345670 00 PC 00100A Z 0
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 31 Exempel: stack och subrutiner, forts 14 ; Antagande. = 00, D1=345670 från start 001006 JSR.S 001050 001060 BNE.S 1058 Fortsätter med resten av programmet Subrutinen har beräknat D1 har använts men återställts D 0 D 0= x x=0 00 D0 0008A3 D1 345670 00 PC 00100A Z 0 TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 32 Vanliga fel vid programmering Glömma # eller $ Ett # eller $ för mycket (på fel ställe) Glömma ange ordlängd på instruktion.w antas om det saknas Läsa/skriva 16 eller 32 bitars ord på udda adresser Ange fel ordlängd Tar bort fel antal element på stacken före retur från subrutin
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 33 Exempel på olämplig/felaktig kod Verkar försöka kontrollera om D2=D3 och skriva ut meddelande annars kopieras värde in i D0 Just nu skrivs det ut korrekt 1 gång Ser ni problemen? Programmet hänger sig till slut huvudprogrammet ; Ej fungerande variant jsr calculate... calculate add.l d0,d1 add.l d2,d1 cmp.l d2,d3 beq printmessage move.l d3,d0 rts ; En subrutin printmessage ; En till subrutin move.l #errorstring,a0 jsr printit printit: ; Ytterligare subrutin... ; Lite mer kod här... bra huvudprogrammet TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 34 Källor till problem i exemplet Svår att felsöka Subrutiner hoppar till varandra via BEQ/BNE Viktigt fel: Växande stack Återhopp till huvudprogram sist i subrutin utan att återställa stack Till slut kommer stacken skriva över data och/eller program huvudprogrammet ; Ej fungerande variant jsr calculate... calculate add.l d0,d1 add.l d2,d1 cmp.l d2,d3 beq printmessage move.l d3,d0 rts ; En subrutin printmessage ; En till subrutin move.l #errorstring,a0 jsr printit printit: ; Ytterligare subrutin... ; Lite mer kod här... bra huvudprogrammet
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 35 Bättre variant Förbättrat/åtgärdad version huvudprogrammet ; Bättre variant jsr calculate... calculate ; En subrutin add.l d0,d1 add.l d2,d1 cmp.l d2,d3 bne dontprint jsr printmessage rts dontprint ; skriv inte ut move.l d3,d0 rts printmessage ; En till subrutin move.l #errorstring,a0 jsr printit rts printit: ; Ytterligare en subrutin... ; Lite mer kod här... rts huvudprogrammet ; Ej fungerande variant jsr calculate... calculate add.l d0,d1 add.l d2,d1 cmp.l d2,d3 beq printmessage move.l d3,d0 rts ; En subrutin printmessage ; En till subrutin move.l #errorstring,a0 jsr printit printit: ; Ytterligare subrutin... ; Lite mer kod här... bra huvudprogrammet TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 36 Varför den nya versionen är bättre En subrutin bör göra enbart en sak och sedan hoppa tillbaks Om fler saker behöver göras låt subrutinen ropa på flera andra subrutiner Detta angreppssätt möjliggör återanvändning av rutiner huvudprogrammet ; Bättre variant jsr calculate... calculate ; En subrutin add.l d0,d1 add.l d2,d1 cmp.l d2,d3 bne dontprint jsr printmessage rts dontprint ; skriv inte ut move.l d3,d0 rts printmessage ; En till subrutin move.l #errorstring,a0 jsr printit rts printit: ; Ytterligare en subrutin... ; Lite mer kod här... rts
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 37 In och utmatning, generellt Alla datorer behöver kommunicera med omvärden (se studenträknarexemplet) Skicka ut en bit via ett register på en speciell adress Läs av en insignal via en speciell adress Problem med den enkla uppsättningen Måste veta i förväg hur många in och utsignaler som ska finnas Kan bara skicka ut alternativt ta emot signal Varje pinne på kretsen kostar extra, vill utnyttja dom maximalt Vissa funktioner är enkla att bygga hårdvara för men dyra att lösa programmeringsmässigt Vissa funktioner har för hög hastighet för att processorn ska hinna med TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 38 In och utmatning, Parallellport Vanlig funktion är parallellporten Skicka ut en byte per gång Läs av en byte per gång Att styra utsignaler Värdet som lagras i utporten finns tillgänglig på datorns utsida Varje gång nytt värde skrivs ändras utsignalerna på en gång I vissa datorer kan man även läsa ut utportens värde Är det datat man skrivit till porten som läses, eller är det värdet på pinnen? Ibland kan båda möjligheterna finnas (två olika adresser)
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 39 In och utmatning, Parallellport, forts. Att läsa av en port är enkelt Välj portens pinnar istället för minnet för någon specifik adress In och utgångar kan kombineras ihop Möjliggör anpassning till aktuellt behov Tillåter dubbelriktad kommunikation (databuss) Måste kunna styra om en pinne ska fungera som ut eller ingång Extra värden används (riktningsinformation) för varje bit Andra specialfunktioner Drivning Pull up/pull down tristate TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 40 Exempel Parallellportsstyrning, Atmel Exempel från Atmel SAM3X (aurdino due) Förenklad vy, total 16 register Varje pinne styrs av flera bitar Välj om pinnen ska kunna skicka ut ett värde (tristate) Välj om pinnen ska kunna skicka ut 0 och 1 eller bara 0 (open collector) Värde som ska skickas ut Välj om värdet alltid blir 1 om pinnen inte ansluten (pull-up) Open collector tristate utvärde logik dator pullup 3.3V Avläst värde omgivning Pinne
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 41 Exempel BCM2835 (raspberry pi) Liknar Atmel-kretsen Kan även välja 0 som förvalt värde om inte ansluten pinne Kan styrka på utsignalen (max ström) Flera olika I/O-enheter kan anslutas till en pinne Välj vilken funktion som ansluts via ytterligare ett register Gäller faktist även Atmel-kretsen http://www.mosaic-industries.com/embeddedsystems/_media/microcontroller-projects/raspberrypi/raspberry-pi-circuit-gpio-input-pins.png TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 42 Parallellport på 68000 (PIA) Enklare än ovan? Riktingsregister väljer funktion på pinnen (ut eller in): Data direction Styrregister för flera andra funktioner: control register Dataregister för att skriva värde/läsa värde till/från port: Peripheral register Använder samma adress för två olika register En bit i statusregistret väljer vilken register som kopplas till en gemensamma adressen Intresserad av mer detaljer? Se detaljerad manual på labbhemsidan (bara 12 sidor)
TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 43 Parallellport på 68000 (PIA), lab1 I labb 1 ska ett tangentbord läsas av och 1 lysdiod styras 4 bitars data (vilken tangent) + Strobe (tangent nedtryckt) från tangentbordet, dvs 5 ingångar 1 bit styr lysdiod, dvs 1 utgång Behöver initiera PIA för att sätta igång utgångar och kunna läsa av tangentbord Färdig kod i labbkompendie för lab1 Läs och försök förstå (jfr med tutormanualen) Mer information finns i avsnitt 4.6 i tutormanual TSEA28 Datorteknik Y (och U), föreläsning 5, Kent Palmkvist 2017-01-23 44 Andra I/O-enheter Kommunikation/styrning Seriella standarder (RS232, SPI, I2C, USB, SATA) Ethernet, bluetooth etc. GUI Tangentbord, mus Skärm Ljud Diverse övriga Kamera Klocka, timer Pulsviddsmodulering för t ex motorstyrning Exempel: Raspberry pi RS232 Parallellport USB (inkl. Ethernet via USB) PCM/I2S ljud I2C/SPI PWM Grafik (HDMI) 205 sidors manual om I/O... Saknar ändå mycket detaljer!
www.liu.se