« »

Maschinencode und Assembler

Eine Kommilitonin hat Ihnen ihren alten Code aus den Übungsaufgaben gegeben. Leider ist ein Teil verloren gegangen, aber Sie sind sich sicher, ihn rekonstruieren zu können.

Hinweis: Bedenken Sie, dass RISC-V das Little-Endian-Format nutzt. Nutzen Sie die RISC-V-Befehlstabelle.

a)

Level 1: Wissen

Sie finden zunächst den Maschinencode 0x00007013. Übersetzen Sie ihn in Assembler.

Lösung
   0    0    0    0    7    0    1    3 (hex)
0000.0000.0000.0000.0111.0000.0001.0011 (binär)
+------------+ +----++-++-----++------+
  imm[11:0]     rs1 funct3 rd   opcode
BestandteilWertBedeutung
opcode0010011I-Typ-Instruktion
funct3111 = 0x7Instruktion andi
rd00000Zielregister x0 (zero)
rs100000Quellregister x0 (zero)
imm[11:0]0000.0000.0000Konstante 0
  • insgesamt: andi zero, zero, 0
  • zu beachten: kodiert werden die Registernummern, die ABI-Namen sind Synonyme für diese Register (z. B. x10 = a0)
  • detaillierter Überblick online

b)

Level 4: Analysieren

Was fällt Ihnen auf, wenn Sie die Semantik der Anweisung betrachten? Was macht diese Instruktion besonders? In welchem Kontext kommt diese Art von Instruktionen zum Einsatz?

Lösung
  • Bedeutung: x0 ← x0 & 0
  • Register x0 (zero) enthält immer 0
  • sogenannte NOP-Instruktion (no operation)
  • kommt zum Beispiel beim Beheben von Pipelining-Hazards zum Einsatz

c)

Level 3: Anwenden

Sie bekommen von Ihrer Nachbarin weiteren Assembler-Code.

addi a1, zero, 0x34
lui a1, 5
addi a2, a1, 0x803
li a3, 36 
xori a4, a3, 0x55

Sie sind neugierig und wollen wissen, was der Code macht. Können Sie sagen, was am Ende in den Registern a1, a2, a3 und a4 gespeichert wird?

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

Lösung

a1 = 0x5000

  • 0x34 wird durch lui überschrieben

a2 = 0x4803

  • Immediate wird mit 12 Bit dargestellt: 0x803 = 1000.0000.0011
  • bei Immediates kommt Sign Extension zum Einsatz
  • Most Significant Bit füllt die verbleibenden Bits für einen 32-Bit-Integer auf
  • somit: 1111.1111.1111.1111.1111.1000.0000.0011
  • Most Significant Bit des 32-Bit-Integers ist eine 1, darum handelt es sich um eine negative Zahl im Zweierkomplement
  • Addition also wie folgt:
  0000.0000.0000.0000.0101.0000.0000.0000 (0x5000)
+ 1111.1111.1111.1111.1111.1000.0000.0011 (0x0803)
= 0000.0000.0000.0000.0100.1000.0000.0011 (0x4803)

a3 = 0x24

a4 = 0x71

  • xori-Rechnung:
  0000.0000.0000.0000.0000.0000.0010 0100 (0x24, 36)
^ 0000.0000.0000.0000.0000.0000.0101 0101 (0x55, 85)
= 0000.0000.0000.0000.0000.0000.0111 0001 (0x71, 113)

Lernziele

In dieser Aufgabe …

  • übersetzen die Studierenden Maschinencode von der Hexadezimaldarstellung zu Assembler.
  • analysieren die Studierenden die Semantik eines einfachen RISC-V-Programms.
  • lernen die Studierenden einige Fallstricke kennen, darunter die Sign Extension bei Immediates und die Darstellung in unterschiedlichen Stellenwertsystemen.