Skip to main content
Department of Information Technology

Computer Architecture, First Course

Assembly 1: Exercise 1

1. Syfte

Att bli bekant med simulatorn för MIPS-processorn, SPIM.

2. Kort om SPIM

SPIM beskrivs i Appendix A.9, s. A-40 i Hennessy & Patterson. Den version som beskrivs här är XSPIM, som kör under X-Windows på UNIX. För att hämta hem din egen kopia av SPIM för Unix/Linux, DOS eller Windows, gå till SPIM:s hemsida och följ relevanta instruktioner för en egen installation.

3. Uppgifter

  1. För laborationen behöver du kopiera ex1.s. Filen innehåller det program som kommer att köras. Titta på koden så att du vet vad den gör.
  2. Starta XSPIM genom att skriva xspim vid kommandoprompten. Det fönster du får upp har några olika delar. Överst finns processorns alla register, därunder ett antal "knappar" som används för att ge kommandon till SPIM och därunder kommer Text Segment, där maskinkoden som ligger i minnet syns. Längre ner finns Data Segment som visar datadelen av minnet och längst ner finns ett fönster där du kan följa vad som händer när du kör programmet. Notera att både text- och datasegmentet kan skrollas. (Om kommandot xspim fungerar inte, försök med /it/sw/misc/bin/xspim)
  3. Börja med att nollställa minne och register med knappen clear. Se till att du verkligen rensar både minne och register.
  4. Nu är det dags att ladda ett program. Klicka på load. Filen du ska ladda heter ex1.s. Klicka sedan på assembly file.
  5. Titta på Textsegmentet. Till vänster ser du adresser, därefter hexadecimal kod för maskininstruktionerna och därefter maskininstruktionerna i "klartext". Längst till höger syns assemblerkoden. Anledningen till att den spalten inte är identisk med maskininstruktionerna är att MIPS har så kallade pseudoinstruktioner; det vill säga, en assemblerinstruktion kan motsvara flera maskininstruktioner. Titta t.ex. på adresserna 0x00400024 och 0x00400028. Där ligger två maskininstruktioner: lui $1, 4097 respektive lw $3, 0($1), men längst till höger ser du att det räcker med en assemblerinstruktion: lw $3, n1($0).
  6. Titta nu på datasegmentet. Frågor:
    • Vilket tal (tolkat som ett ord (word)) ligger på adress 0x10010000?
    • Vilken talbas används?
    • På vilken adress ligger talet 0x00000017?
    • Vad finns på adress 0x10010008?
  7. Fråga:
    • Vilka värden har R3 respektive R4?
  8. Starta programmet. Klicka på run. Du får då se vilken adress programmet kommer att starta på. Klicka på ok.
  9. Titta nu på register R3 och R4 igen. Fråga:
    • Vad innehåller registren?
  10. Fråga:
    • Vilket värde i datasegmentet har ändrats och vad är det nya värdet?
  11. Nu ska vi följa programexekveringen. Rensa först minnet och registren igen och ladda in filen på nytt. Det är viktigt att du gör detta för att ordentligt kunna se vad som händer i nästa uppgift.
  12. Sätt brytpunkter i programmet. Klicka på breakpoints. Vi ska sätta ut tre brytpunkter: den första vid etiketten (eng. label) main i programmet (titta i koden) och eftersom detta är en globalt definierad etikett så kan du skriva main i rutan och klicka på add. Klicka sedan på list för att se om brytpunkten blivit satt. Om allt är rätt kommer det upp en text längst ner i fönstret som talar om på vilken adress du har satt en brytpunkt. Titta i textsegmentet. Fråga:
    • Vilken assemblerinstruktion ligger på den adressen? (Det är alltså där som programmet börjar. Den kod du ser från adress 0x00400000 och fram till main är kod som simulatorn använder sig av för att starta programexekvering.)
  13. Nu vill vi sätta två brytpunkter till: en vid instruktionen add $4, $4, $3. Titta efter i textsegmentet på vilken adress den instruktionen ligger. Frågor:
    • På vilken adress ligger instruktionen? Sätt en brytpunkt på den adressen. Sätt sedan ytterligare en brytpunkt vid nästa instruktion.
    • Vilken adress har den brytpunkten? (Titta efter med list så att alla brytpunkter finns där de ska.)
  14. Starta programmet. Det kommer att stoppa vid första brytpunkten, precis innan själva programmet börjar exekvera. Frågor:
    • Vad finns i register R3 och R4?
    • Vad har PC för värde? (PC finns längst upp till vänster.)
  15. Fortsätt programexekveringen genom att klicka på continue. Exekveringen stannar nu vid nästa brytpunkt. Fråga:
    • Vilka värden har registren PC, R3 och R4?
  16. Fortsätt programexekveringen. Fråga:
    • Vilka värden har PC, R3 och R4 vid nästa (och sista) brytpunkten?
  17. Prova att ta bort en brytpunkt och lista sedan så att du ser att den är borta.
  18. Rensa minne och register och ladda programmet på nytt. Prova nu att stega igenom programmet och följ vad som händer i register och minne. Klicka på step. Number of steps anger hur många instruktioner SPIM ska utföra i varje steg. Kör med en instruktion per steg. Klicka sedan på step så utför maskinen en instruktion. Längst ner i fönstret ser du den instruktion som just utförts. PC innehåller (som vanligt) adressen till nästa instruktion som ska utföras. Klicka dig fram tills PC innehåller adressen 0x00400020, där programmet startar. Fortsätt sedan med en instruktion i taget och följ vad som händer i register och minne.
  19. Prova att skriva ut saker: under print kan du markera global symbols. Längst ner visas då vilka globalt definierade symboler som finns i programmet, i det här fallet enbart main. Fråga:
    • Vad innehåller minnet på minnesadresserna 0x10010000 - 0x10010010?
  20. Städa minne och register och ladda om programmet igen. Nu ska du ändra direkt i minnet så att programmet adderar talen 35 och 16 istället. Använd set value för att lägga in de nya värdena i minnet (talen skrivs in som decimala tal). Kör sedan programmet och kontrollera att det ger rätt resultat.

4. Facit

Svar på frågorna kan hittas här.

Go back to the Assembly 1 page.

Updated  2004-11-12 13:39:45 by Zoran Radovic.