MIPS-Assembler-Code: Erkennung von Data-Hazards

Hallo. Ich habe ein Problem mit der Musterlösung der folgenden Aufgabe über MIPS-Assembler und Data-Hazards:

Aufgabenstellung: Markieren sie alle möglicherweise auftretenden Data-Hazrards in folgendem MIPS-Assembler-Code. Nennen sie jeweils den Typ des auftretenden Hazards und geben sie an, ob ein Pipeline-Stall auftritt. Falls, ja, skizzieren Sie im Code, was der Compiler dagegen tun könnte.

Code:

 main: 
 addi $sp, $sp, -4
 sw $ra, 0($sp)
 li $a0, 0x10000000 # =lui + ori = EX-Hazard
 lw $a0, 0($a0) # MEM + EX-Hazard mit lui + ori
 addi $a0, $a0 1 # Load-Use-Hazard mit lw,MEM-H. mit ori
 li $a1, 42
 sll $a1, $a1, 2 # EX-Hazard mit li
 jal x
 lw $ra, 0($sp)
 addi $sp, $sp, 4
 j $ra
 x: ...

Die Kommentare rechts sind Teil der Musterlösung.
Ich verstehe nicht, warum lui + ori ein EX-Hazard ist. Kann man vielleicht den Code so umschreiben, dass dann wirklich was mit lui + ori da steht, so dass es vielleicht klarer wird?
Warum kann ich nicht bei „li $a1, 42“ auch davon aus gehen, dass man daraus lui + ori=Ex-Hazard machen kann?

Mit freundlichen Grüßen,
Ralf

Guten Tag Ralf,

also was ich mir - ohne deine konkrete MIPS-Maschine leider näher zu kennen - vorstellen kann, ist folgendes:
Der erste li-Befehl lädt die Immediate-Zahl 0x10000000, die mit 29 Bit für das im OpCode vorgesehene Immediate-Feld viel zu groß ist, weshalb eine Aufsplittung in zwei Befehle durch den Assembler vorgenommen werden muss. Daher die ersatzweise Verwendung von lui- und ori-Befehlen.
Beim zweiten li-Befehl wird als Immediate die Dezimalzahl 42 angegeben, was sich mit einem Byte leicht darstellen lässt und auch leicht in das Immediate-Feld des OpCodes passen sollte. Daher muss hier keine Befehlsersetzung vom Assembler her vorgenommen werden.