« »

Speicherzugriffe

a)

Level 3: Anwenden

Gegeben ist das folgende RISC-V-Assemblerprogramm mit Speicherzugriffen. Nehmen Sie an, dass zu Beginn alle Register auf den Wert 0 initialisiert wurden.

    addi a1, zero, 0x10
loop:
    bgt  a2, a1, end
    addi a2, a2, 4
    srli a1, a1, 1
    lw   a3, 0x504(a2)
    slli a4, a3, 4
    sw   a4, 0x500(a2)
    jal  x0, loop
end:

Der Speicher ist wie folgt initialisiert:

0x500: 0x12345678  
0x504: 0xDEADBEEF  
0x508: 0x50505050  
0x50C: 0x77773333  
0x510: 0x12345678

Welchen Inhalt haben die 32-Bit-Speicherworte 0x504 und 0x508, wenn die Ausführung das Label end erreicht hat?

Diese Aufgabe war Teil der Klausur im Sommersemester 2025 (Zweittermin).

Lösung

Startzustand (einschließlich Zeile 1):

  • a1 = 0x10 (16)
  • a2 = a3 = a4 = 0

Erster Durchlauf:

Z.AnweisungBedeutungNotiz
3bedingter Sprunga2 (0) > a1 (16)?falsch, kein Sprung, weiter mit nächster Instruktion
4Additiona2 <- 0 + 4 = 4
5Shifta1 <- 16 >> 1 = 8
6Ladena3 <- Mem[0x504 + 4] = 0x50505050
7Shifta4 <- a3 << 4 = 0x05050500(4 Bit = 1 Hexadezimalstelle)
8SpeichernMem[0x500 + 4] <- a4 = 0x05050500

Zweiter Durchlauf:

Z.AnweisungBedeutungNotiz
3bedingter Sprunga2 (4) > a1 (8)?falsch, kein Sprung, weiter mit nächster Instruktion
4Additiona2 <- 4 + 4 = 8
5Shifta1 <- 8 >> 1 = 4
6Ladena3 <- Mem[0x504 + 8] = 0x77773333
7Shifta4 <- a3 << 4 = 0x77733330(4 Bit = 1 Hexadezimalstelle)
8SpeichernMem[0x500 + 8] <- a4 = 0x77733330

Schleifenende:

Z.AnweisungBedeutungNotiz
3bedingter Sprunga2 (8) > a1 (4)?wahr, Sprung zum Label end

Ergebnis:

Mem[0x504] = 0x05050500  
Mem[0x508] = 0x77733330

Lernziele

In dieser Aufgabe …

  • üben die Studierenden das Simulieren einfacher Assembler-Programme.
  • betrachten die Studierenden die Effekte von Load- und Store-Anweisungen.