1(5) Övningstentamen i Mikrodatorer och assemblerprogrammering, ELGA05 Hjälpmedel: Bifogad lista med memokoder för MC68xxx. Samtliga programmeringsuppgifter ska innehålla flödesschema med förklaringar och programkod med kommentarer. På övriga gäller: -motivering krävs för poäng Lösningarna skall förses med figurer och förklaringar så att de är lätta att följa. Observera att det är många fler frågor på övningstentan än på den riktiga. Det kommer att bli två-tre frågor på varje avsnitt. Allmänna frågor: 1a) Ett assemblerprogram byggs upp av kod, data och assemblerdirektiv. Beskriv kortfattat skillnaden mellan hur kod och assemblerdirektiv används vid assemblerprogrammering. b) Ge två exempel på olika assemblatordirektiv. 2a) Skriv en programrad som ettställer bit nr 0, nr 5 och nr 20 i dataregister D0. Registrets alla övriga bitar ska lämnas opåverkade. b) Skriv kod (högst 2 rader) som inverterar de 8 högsta och nollställer de 8 lägsta bitarna i register D3. Övriga bitar ska vara oförändrade. 3a) Motorola 68340 har ett antal olika flaggor. Nämn 3 av dessa, och beskriv när de ettställs. b) Antag att samtliga flaggor är ställda som följer: C=0, V=0, N=1, Z=1 Skriv en eller ett antal instruktioner som nollställer Z-flaggan och N-flaggan. Övriga flaggor får ej påverkas (=> 0 poäng). c) Antag att samtliga flaggor är ställda som följer: C=0, V=0, N=1, Z=1 Beskriv vilka flaggor som ändras och vilka som inte ändras, då nedanstående program exekverats. MOVE.B #$FF, D0 ADDI.B #$FF, D0 4) Antag att samtliga flaggor är nollställda före följande sekvens utförs. Vad har N, V, Z och C-flaggan för värde efteråt? a) MOVE.B #$7F, D0 ADDI.B #$0F, D0 b) MOVE.B #$00, D0 SUBI.B #$0A, D0 c) MOVE.L #$FF, D0 ADDI.L #$FF, D0 5) Skriv en bit-test som avgör om ett tal i D0 är ett udda tal. Talet i D0 är 32-bitar stort. 6) Tabellen (array) tal är definierad som: tal: DC.B 1,2,3,4 Nollställ tabellen med hjälp av endast en instruktion. 7) Beskriv tre sätt att överföra parametrar mellan huvudprogram och subrutin.
2(5) Analys av programkod: 1) När nedanstående kod simuleras eller körs på kortet kommer programmet att spåra ur. Varför, d.v.s. vad är fel i nedanstående kod? main: JMP subrutin1 BRA main subrutin1: NOP RTS 2) En av nedanstående programrader (A eller B) kommer inte att fungera. Vilken och varför? (motivering krävs för poäng) org $4000 move.l (data1).l,d0 (A) move.w (data2).l,d0 (B) org $5005 data1 dc.b 1 data2 dc.b 2 data3 dc.b 3 data4 dc.b 4 3) Vilka värden på nn gör att programmet hoppar till hopp? Motivering krävs vad BMI gör. Svara i hexadecimal- eller binär form. MOVE.B #$nn,d0 BMI hopp BRA start hopp: NOP BRA hopp 4) Vilken 32-bitars adress avses med följande instruktion? MOVE.W ($8034).W,D0 5) Ett minne är initierat enligt tabell. Vad är innehållet i register D2 efter att följande instruktionsföljd exekverats? Tabell $5000 $14 $5001 $15 $5002 $16 $5003 $17 $5004 $18 $5005 $19 $5006 $1A $5007 $1B $5008 $1C $5009 $1D MOVE.L #$2,D0 MOVEA.L #$5000,A0 MOVE.W (2,A0,D0),D2
3(5) 6a) Till vilken etikett hoppar programmet, och varför, vid följande exekvering? MOVE.B #$9B,D0 CMPI.B #$08,D0 BLE hopp1 BRA hopp2 b) Till vilken etikett hoppar programmet, och varför, vid följande exekvering? MOVE.B #$F1,D0 ROR.B #$1,D0 BCS hopp1 BRA hopp2 7) Nedanstående program gör någonting. Tyvärr glömde författaren att skriva in kommentarer om vad programmet gör. Beskriv vad programmet gör. (Dock ej rad för rad). ORG $4000 Main: MOVEA.L #tabell_1,a0 MOVEA.L #tabell_2,a1 MOVEA.L #tabell_3,a2 MOVEA.L #tabell_4,a3 MOVEA.L #tabell_5,a4 BSR sub forever: BRA forever sub: MOVE.B (A0),D3 CMPI.B #$00,D3 BEQ sub_exit ADDA.L #1,A0 BSR sub sub_exit: MOVE.B -(A0),(A4)+ RTS tabell_1: DC "gnirdnav" tabell_2: DC.B $00 tabell_3: DC "dels" tabell_4: DC.B $00 tabell_5: DS.B 30
4(5) Stacken, stackhantering och avbrott: 1) Beskriv vad stacken är och vad den används till. 2) Beskriv hur stacken används vid ett subrutinanrop. Ge exempel. 3) Hur ser stacken ut när programmet kommer till etiketten A, innan instruktionen RTS har exekverats? Antag att stackpekaren står på $8000 vid programstarten main. Redovisa stacken med två kolumner, en som visar stackadressen och en som visar stackinnehållet. En byte per rad. (i svåraste laget?) 00004000 2. ORG $4000 3. 00004000 3F39 0000 4044 4. main: MOVE.W (svar).l,-(sp) 00004006 2F3C 0000 4040 5. MOVE.L #var1,-(sp) 0000400C 2F3C 0000 4042 6. MOVE.L #var2,-(sp) 00004012 4EB9 0000 402A 7. JSR subrutin1 00004018 302F 0008 8. MOVE.W (8,SP),D0 0000401C 33C0 0000 4044 9. MOVE.W d0,(svar).l 00004022 DFFC 0000 000A 10. ADDA.L #10,SP 00004028 60FE 11. loop: BRA loop 12. 0000402A 13. subrutin1: 0000402A 4CEF 0300 0004 14. MOVEM.L (4,SP),A0-A1 00004030 203C 0000 0000 15. MOVE.L #0,D0 00004036 D050 16. ADD.W (A0),D0 00004038 D051 17. ADD.W (A1),D0 0000403A 3F40 000C 18. MOVE.W D0,(12,SP) 0000403E 4E75 19. A: RTS 20. 00004040 0041 21. var1 DC.W $0041 00004042 0001 22. var2 DC.W $0001 00004044 0000 23. svar DC.W $0000 4) Beskriv de båda avbrottsmetoderna autovektoravbrott och vektoravbrott så att skillnaderna klart framgår. Programmeringsuppgifter: 1) Skriv en subrutin som beräknar antalet 1:or i dataregister D3. Antalet returneras via dataregister D5. 2) Skriv en subrutin BER som beräknar X-Y. Registren D0 och D1 innehåller talen och resultatet ska levereras i D2. 3) En subrutin använder registren D0-D2 och A0. Skriv de rader i subrutinen som behövs för att huvudprogrammet inte ska påverkas.
5(5) 4) Skriv en subrutin som beräknar summan av 8 stycken tal som finns lagrade i en tabell. Tabellen ska användas vid beräkning. Resultatet ska lagras i variabeln summa. tal: DC.B 1, -2, 3, 5, -8, 4, 3, 2 summa: DC.B 0 5) Ett bevakningssystem styr motorn på en kamera. Samma system har också en digital ingång som varnar för brand. Om brand uppstått ska systemet automatisk ringa 112. Ett sätt att skriva en sådan kontroll är att hela tiden kontrollera om ingången för brandlarmet löst ut, vilket är tämligen ineffektivt. Föreslå ett annat, mer effektivt sätt att anropa en programbit som ringer upp 112 i händelse av brand. 6) Skriv en subrutin som utför följande algoritm: Läs inport Översätt inport enligt tabell (invärde till utvärde) Om värdet finns, skriv ut det översatta värdet till utporten. Om värdet ej finns, skriv värdet 255 till utporten Med tanke på tabellens storlek, ska översättningen göras med hjälp av en tabell i minnet (RWM) och inte med ett antal villkorliga hopp. Tabell 1: in ut 0 36 20 52 38 88 50 100 60 102 85 127 100 153 150 200 175 225 övriga värden 255 + ev uppgifter från labbarna!