Der annullierte Verzweigungsbefehl bewirkt, dass der Befehl im Verzögerungsschlitz - der Befehl nach der Verzweigung - ignoriert wird, wenn die Verzweigung nicht ausgeführt wird.
Warum sollte das wichtig sein? Weil normalerweise der Befehl nach der Verzweigung ausgeführt wird, selbst wenn die Verzweigung genommen wird. Dies liegt daran, dass zwei Programmzähler vorhanden sind, PC und NPC. PC, der anzeigt, dass der Befehl ausgeführt wird, wird zu NPC aktualisiert, was PC + 4 ist, zur selben Zeit, zu der der NPC auf das Ziel des Verzweigungsbefehls aktualisiert wird. Wegen des Timings dieser Ereignisse muss der nächste Befehl geladen werden. Anstatt diesen Zyklus einfach wegzuwerfen, ist es profitabler, diesen Zyklus zu nutzen, wenn wir können. Wir würden dann diese Anweisung nur Teil der Schleife machen.
loop: someOp
someOtherOp
branch loop ;
delayslotOp ; will actually be executed, before someOp, after branch
Wenn wir nicht den Befehls-Slot nach der Verzweigung verwenden können, dann halten wir eine nop dort, und nichts tun an diesem Zyklus.
Warum also dann unterschiedliche Anweisungen mit annullierten und nicht annullierten Verzweigungsoptionen? Um uns die Wahl zu geben, was beim Verlassen der Schleife passiert. Wenn wir den Delay-Slot Teil der Schleifenaktivität gemacht haben, möchten wir vielleicht nicht, dass dieser Op beim Verlassen der Schleife ausgeführt wird. Daher würden wir ", a" am Ende der Verzweigungsinstruktion hinzufügen.
This page has some nice examples.