Czy niektóre kody NOP są traktowane inaczej niż inne?

12

Ciekawi mnie to, powiedzmy, że mam:

00000000001 90                              nop        
00000000002 90                              nop        
00000000003 90                              nop 

Czy jest wykonywany dokładnie tak samo jak ten?

00000000001 0F1F00                          nop        dword [ds:rax]

Jaki wpływ miałby drugi przykład w porównaniu z pierwszym?

Tom Boobas
źródło
1
Byłbym skłonny sądzić, że drugi wykona się szybciej niż pierwszy, ponieważ jest to jedna instrukcja, a nie 3. Możliwe jednak, że nowoczesny potok zmieni to.
Loren Pechtel
1
Dlaczego jest to oznaczone c ?
Keith Thompson,
Google dla multi byte nop, pokazuje całkiem sporo wyników.
phant0m
1
@KeithThompson - ściągnąłem C i tagi w stylu kodowania; nie należały.
@ phant0m - czy umieściłbyś ten komentarz w odpowiedzi i podsumował niektóre bardziej trafne wyniki? Nie wszyscy mamy doświadczenie, aby właściwie zrozumieć, co wróci z tego zapytania.

Odpowiedzi:

2

To zależy od architektury maszyny. Klasyczny KA-10 (pdp-10) miał wiele kodów nop, prawdopodobnie konsekwencją bardzo regularnego zestawu instrukcji oraz faktu, że wszystko to zostało zaimplementowane przez komponenty deskryptowane, a nie mikrokod. Niektóre NOP odwoływały się do pamięci, niektóre były testami pomijania, które nigdy nie pomijały, ale mimo to testowały stan, który mógł powodować pomijanie itd. „JFCL 0” był reklamowany w instrukcji jako najszybszy nop.

ddyer
źródło
Pracowałem kiedyś nad asemblerem (8085?), Który oferował opcję zamiany wielu NOP na jedną instrukcję JMP. Masz wyrównanie, którego chciałeś, bez płacenia kary za wydajność. Przydatne, gdy masz ciągi w PIC, nie tak przydatne, jeśli masz pętle czasowe oparte na procesorze (dlatego domyślnie było wyłączone).
TMN
Najczęściej instrukcja NOP jest używana do wstawiania krótkiego opóźnienia, zwykle w wyniku pewnej zależności sprzętowej lub błędu urządzenia. Kara za wydajność jest przyczyną korzystania z NOP.
u
1
nops ma wiele zastosowań ezoterycznych. Niektóre architektury mają wymagania dotyczące wyrównania bajtów dla skoków. Kod samomodyfikujący (horrory!) Używał nops jako punktów łączenia. Systemy błędów używały nops do przechowywania informacji o nieudanych asercjach.
ddyer
@ddyer: Niektóre procesory mają instrukcje (czasem udokumentowane, czasem nie), które pobiorą bajt pamięci i albo całkowicie zignorują pobraną wartość, albo nie zrobią z nią nic oprócz ustawionych flag, których programista może nie obchodzić. Na 6502 dość często stosowano instrukcję „BIT abs” jako sposób na pożarcie kolejnych dwóch bajtów; istnieją również nieudokumentowane kody operacyjne, które zachowują się podobnie, z tym że nie aktualizują żadnych flag. Jedno zastrzeżenie z takimi sztuczkami: spowodują odczyt bajtu przestrzeni adresowej. Niektóre urządzenia peryferyjne 6502 mogą reagować na operacje odczytu.
supercat
0

Wydaje się, że drugi przykład powinien działać szybciej niż pierwszy. W pierwszym przykładzie zostaną wykonane trzy oddzielne instrukcje. W drugim tylko jedna instrukcja. Wielobajtowe NOP są przeznaczone do użycia w „wskazówkach” procesora (dokładnie jak i kiedy są pozornie poufne ). Mogą być przydatne do celów wyrównywania (w celu uruchomienia ciasnej pętli na linii pamięci podręcznej), ale obecnie nie mają innego zastosowania. Nie jest jasne, czy procesor faktycznie ocenia argumenty, więc nie można powiedzieć, czy wydłuża czas dekodowania instrukcji, czy też ponosi karę za dostęp do pamięci. Ktoś z dobrym ICE chce przetestować jeden z nich i zobaczyć, jakie adresy pojawiają się na śladzie autobusowym?

TMN
źródło
Chociaż wiele asemblerów 6502 używa mnemonicznego „NOP” dla nieudokumentowanych kodów operacyjnych, które wykonują pobieranie pamięci (np. NOP 1FF9) byłoby dwubajtową instrukcją, która odczytuje adres 0x1FF9 i ignoruje odczytaną wartość), nie spodziewałbym się, że producent układu użyj terminu „nop” dla instrukcji, która robi cokolwiek poza przesunięciem licznika programu / wskaźnika instrukcji, ponieważ nie ma gwarancji, że procesor nie zostanie podłączony do sprzętu, który wyzwala działania (np. przejście do banku kodów 1), gdy pewne adresy (jak 0x1FF9 ) są dostępne, a takie wyzwalanie nie jest dokładnie „brakiem operacji”.
supercat