Werden einige NOP-Codes anders behandelt als andere?


12

Ich bin neugierig, sagen wir mal:

00000000001 90                              nop        
00000000002 90                              nop        
00000000003 90                              nop 

Wird es genauso ausgeführt?

00000000001 0F1F00                          nop        dword [ds:rax]

Welchen Effekt hätte das zweite Beispiel im Gegensatz zum ersten?


1
Ich würde gerne glauben, dass die zweite schneller als die erste ausgeführt wird, da es sich um eine Anweisung handelt und nicht um 3. Es ist jedoch möglich, dass das moderne Pipelining dies ändert.
Loren Pechtel

1
Warum ist das mit c markiert ?
Keith Thompson

Google für multi byte nopzeigt einige Ergebnisse.
Phant0m

1
@KeithThompson - Ich habe die Tags C und Coding gezogen. sie gehörten nicht dazu.

@ phant0m - Würden Sie diesen Kommentar in eine Antwort einfügen und einige der relevanteren Ergebnisse zusammenfassen? Nicht alle von uns haben den Hintergrund, um richtig zu verstehen, was von dieser Suchanfrage zurückkommen würde.

Antworten:


2

Dies hängt von der Maschinenarchitektur ab. Der klassische KA-10 (pdp-10) hatte viele NOP-Codes, wahrscheinlich eine Folge seines sehr regelmäßigen Befehlssatzes und der Tatsache, dass alles von diskreten Komponenten implementiert wurde, nicht von Mikrocode. Einige NOPs verwiesen auf Speicher, andere waren Übersprungtests, die nie übersprungen wurden, aber dennoch den Zustand testeten, der möglicherweise einen Übersprung verursacht hat, und so weiter. "JFCL 0" wurde im Handbuch als schnellster NOP beworben.


Ich habe einmal an einem (8085?) Assembler gearbeitet, der die Option bot, mehrere NOPs durch einen einzigen JMP-Befehl zu ersetzen. Sie haben die gewünschte Ausrichtung erhalten, ohne die Leistungsstrafe zu zahlen. Praktisch, wenn Sie Zeichenfolgen in PIC hatten, nicht so praktisch, wenn Sie CPU-basierte Zeitschleifen hatten (weshalb diese standardmäßig deaktiviert waren).
TMN

In den meisten Fällen wird der NOP-Befehl verwendet, um eine kurze Verzögerung einzufügen, normalerweise aufgrund von Hardwareabhängigkeiten oder Gerätefehler. Die Leistungsstrafe ist der Grund für die Verwendung des NOP.
uɐɪ

1
Nops haben viele aesoterische Verwendungen. Einige Architekturen stellen Anforderungen an die Byte-Ausrichtung für Sprünge. Selbstmodifizierender Code (Horror!) Verwendete Nops als Spleißpunkte. Fehlersysteme verwendeten Nops, um Informationen über fehlgeschlagene Behauptungen zu speichern.
Ddyer

@ddyer: Einige Prozessoren verfügen über Anweisungen (manchmal dokumentiert, manchmal nicht), die ein Speicherbyte abrufen und entweder den abgerufenen Wert vollständig ignorieren oder nichts damit tun, außer Flags zu setzen, die dem Programmierer möglicherweise egal sind. Auf dem 6502 war es ziemlich üblich, den Befehl "BIT abs" zu verwenden, um die nächsten zwei Bytes zu verschlingen. Es gibt auch einige undokumentierte Opcodes, die sich ähnlich verhalten, außer dass sie keine Flags aktualisieren. Eine Einschränkung bei solchen Tricks: Sie bewirken, dass ein Byte Adressraum gelesen wird. Einige 6502-Peripheriegeräte reagieren möglicherweise auf Lesevorgänge.
Supercat

0

Es scheint, dass das zweite Beispiel schneller als das erste ausgeführt werden sollte. Im ersten Beispiel werden drei separate Anweisungen ausgeführt. Im zweiten nur eine Anweisung. Die Multi-Byte-NOPs sollen für CPU- "Hinweise" verwendet werden (genau wie und wann ist anscheinend vertraulich ). Sie können für Ausrichtungszwecke nützlich sein (um eine enge Schleife in einer Cache-Zeile zu starten), haben aber derzeit keine andere Verwendung. Es ist unklar, ob die CPU die Argumente tatsächlich auswertet, daher kann nicht gesagt werden, ob sie die Befehlsdecodierungszeit verlängert oder eine Speicherzugriffsstrafe verursacht. Möchte jemand mit einem guten ICE eine davon testen und sehen, welche Adressen auf einer Busverfolgung angezeigt werden?


Obwohl viele 6502-Assembler die Mnemonik "NOP" für undokumentierte Opcodes verwenden, die einen Speicherabruf durchführen (z. B. NOP $ 1FF9), wäre dies ein Zwei-Byte-Befehl, der die Adresse 0x1FF9 liest und den gelesenen Wert ignoriert. Dies würde ich von einem Chiphersteller nicht erwarten Verwenden Sie den Begriff "nop" für einen Befehl, der über den Programmzähler / Befehlszeiger hinausgeht, da nicht garantiert werden kann, dass ein Prozessor nicht an Hardware angeschlossen wird, die bei bestimmten Adressen (z. B. 0x1FF9) Aktionen auslöst (z. B. Umschalten auf Codebank 1) ) wird zugegriffen, und eine solche Auslösung ist nicht genau "keine Operation".
Supercat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.