nop
Pseudoelementlyszt.net behandelt nop und andere RISC-V-Befehle ausführlicher.
Beschreibung
nop bewirkt nichts. Der Name ist die Kurzform von „no operation“ (keine Operation). Wenn der Prozessor auf einen nop trifft, ändert sich kein Register, kein Speicher wird berührt, und die Ausführung fährt mit der nächsten Anweisung fort. Er belegt einen Slot im Programm, und ein Zeittakt vergeht.
nop ist eine Pseudo-Anweisung für die folgende Zeile.
addi zero, zero, 0
RISC-V enthält ein Register namens zero, das immer 0 enthält. Ein Lesezugriff liefert 0, und ein Schreibzugriff wird verworfen. Dieses addi addiert 0 und 0 und verwirft das Ergebnis, sodass die Anweisung abgeschlossen wird und sich nichts ändert. RISC-V benötigt kein eigenes nop, weil das zero-Register eines bereitstellt.
Echte Prozessoren verwenden nops als Auffüllung, damit eine spätere Anweisung an einer Speichergrenze beginnt, die die Hardware schneller verarbeitet, und als Platzhalter, die Werkzeuge später mit echten Anweisungen überschreiben. Compiler fügen sie routinemäßig ein, weshalb disassemblierter Code sie enthält, obwohl kein Programmierer sie eingegeben hat.
Das RISC-V-Handbuch stellt fest, dass nop keinen architektonisch sichtbaren Zustand ändert, also nichts, was ein Programm beobachten kann, abgesehen vom Vorrücken des pc und dem Inkrementieren etwaiger Leistungszähler. Es nennt zwei Verwendungen: das Ausrichten von Codesegmenten an Adressgrenzen, die zur Hardware passen, und das Freihalten von Platz für spätere Änderungen am Code. Das Handbuch erklärt, dass die Kodierung addi verwendet, weil diese Anweisung auf den meisten Systemen die wenigsten Ressourcen kostet, da sie nur ein Register liest.
In diesem Simulator dient nop als Abstandshalter oder Markierung während Experimenten. Das Überspringen eines nops rückt den pc um 4 vor und ändert kein Register und keine Speicherstelle.
Wird erweitert zu
addi zero, zero, 0
Der Assembler ersetzt diese Pseudoanweisung durch die oben aufgeführte(n) echte(n) Anweisung(en).
Beispiel
li t0, 1 nop # advances one instruction, changes nothing addi t0, t0, 1 # t0 = 2
