NOP (kod) - NOP (code)
Kod maszynowy |
---|
Pojęcia ogólne |
Instrukcje |
W informatyce , NOP , no-op lub NOOP (wymawiane "no op"; skrót od no operation ) to instrukcja języka maszynowego i jej mnemonika języka asemblerowego , instrukcja języka programowania lub polecenie protokołu komputerowego, które nic nie robi.
Instrukcje języka maszynowego
Niektóre zestawy instrukcji komputerowych zawierają instrukcje, których wyraźnym celem jest niezmienianie stanu żadnego z dostępnych dla programisty rejestrów , flag stanu lub pamięci . Wykonanie często zajmuje ściśle określoną liczbę cykli zegara . W innych zestawach instrukcji nie ma wyraźnej instrukcji NOP, ale mnemonik języka asemblerowego NOP reprezentuje instrukcję, która działa jako NOP; np. na SPARC , sethi 0, %g0
.
NOP nie może uzyskać dostępu do pamięci, ponieważ może to spowodować błąd pamięci lub błąd strony .
NOP jest najczęściej używany do celów czasowych, w celu wymuszenia wyrównania pamięci , zapobiegania zagrożeniom , zajmowania gniazda opóźnienia rozgałęzienia , unieważniania istniejącej instrukcji, takiej jak skok, jako cel instrukcji wykonywania lub jako miejsce posiadacza, który zostanie zastąpiony aktywnymi instrukcjami w późniejszym okresie tworzenia programu (lub w celu zastąpienia usuniętych instrukcji, gdy reorganizacja byłaby problematyczna lub czasochłonna). W niektórych przypadkach NOP może mieć niewielkie skutki uboczne; na przykład w procesorach serii Motorola 68000 kod operacji NOP powoduje synchronizację potoku .
Poniżej wymieniono instrukcje NOP dla niektórych architektur procesorów:
Architektura procesora | Instrukcja mnemoniczna | Bajty | Kod operacji | Uwagi |
---|---|---|---|---|
Rodzina procesorów Intel x86 |
NOP
|
1; 1–9 dla i686 i x86-64 | 0x 90 | 0x90 dekoduje do xchg eax, eax we wszystkich trybach z wyjątkiem trybu długiego , w którym kod 0x90 nadal nie działa. Dłuższe kodowania są opisane w podręczniku Intela.
|
Rodzina Intel 8051 / MCS-51 |
NOP
|
1 | 0x00 | |
Ramię A32 |
NOP
|
4 | 0x00000000 | To oznacza andeq r0, r0, r0 . Instrukcja asemblera nop najprawdopodobniej rozwinie się do mov r0, r0, które jest zakodowane jako 0xE1A00000 (architektura little-endian). |
Ramię T32 (16 bitów) |
NOP
|
2 | 0xb000 | Opcode dla ADD SP, #0 - Dodaj zero do wskaźnika stosu (brak operacji). Instrukcja asemblera nop najprawdopodobniej rozwinie się do mov r8, r8, które jest zakodowane jako 0x46C0. |
Ramię T32 (32 bity) |
NOP
|
4 | 0xF3AF 8000 | |
Ramię A64 (64-bitowe) |
NOP
|
4 | 0xD503201F | |
AVR |
NOP
|
2 | 0x0000 | jeden cykl zegara |
IBM System/360 , IBM System/370 , IBM System/390 , z/Architecture , UNIVAC Seria 90 |
NOP
|
4 | 0x47000000 lub 0x470nnnnn lub 0x47n0nnnn, gdzie „n” to dowolna wartość 4-bitowa. | NOP ("Rejestr No-Op") i NOPR ("Rejestr No-Op") stanowią podzbiór instrukcji odpowiednio "Oddział pod warunkiem" lub "Rejestr odgałęzienia pod warunkiem"; obie wersje mają dwie opcje generowania NO-OP.
W przypadku obu instrukcji NOP i NOPR pierwsze 0 w drugim bajcie to wartość „maski”, warunek do testowania taki jak równy, nierówny, wysoki, niski itp. Jeśli maska wynosi 0, nie ma rozgałęzienia występuje. W przypadku instrukcji NOPR druga wartość w drugim bajcie to rejestr do rozgałęzienia. Jeżeli wybrany jest rejestr 0, to żadna gałąź nie występuje niezależnie od wartości maski. Tak więc, jeśli jedna z dwóch wartości w drugim bajcie wynosi 0, rozgałęzienie nie nastąpi. W przypadku instrukcji NOP, druga wartość w drugim bajcie jest rejestrem „podstawowym” połączonego rejestru podstawowego, rejestru przemieszczenia i adresu offsetu. Jeżeli rejestr bazowy ma również wartość 0, gałąź nie jest brana niezależnie od wartości rejestru przemieszczeń lub adresu przemieszczenia. |
NOPR
|
2 | 0x0700 lub 0x070n lub 0x07n0, gdzie „n” to dowolna wartość 4-bitowa. | ||
SuperH |
NOP
|
2 | 0x0009 | |
MIPS |
NOP
|
4 | 0x00000000 | Oznacza sll r0,r0,0 , co oznacza: Logicznie przesuwa rejestr 0 bity zerowe w lewo i przechowuje wynik w rejestrze 0. Zapisy do rejestru 0 są ignorowane; zawsze zawiera 0.
|
MIPS-X |
NOP
|
4 | 0x60000019 | (rozszerzony kod operacyjny dla add r0,r0,r0 )
|
MIESZAĆ |
NOP
|
1 słowo | ± * * * * 0 | Bajty * są dowolne i mogą mieć wartość od 0 do maksymalnego bajtu (wymagane, aby mieściły się w zakresie 63-99). MIX wykorzystuje reprezentację znak-wielkość. |
MMIX |
SWYM
|
4 | 0xFD****** | SWYM to skrót od „Sympathize with your machine”. Cyfry * można wybrać dowolnie. |
Rodzina Motorola 68000 |
NOP
|
2 | 0x4E71 | To synchronizuje potok i zapobiega nakładaniu się instrukcji. |
Motorola 6809 |
NOP
|
1 | 0x12 | |
Technologia MOS 65xx (np. 6502 ) |
NOP
|
1 | 0xEA | NOP zużywa dwa cykle zegara. Niezdefiniowane kody operacji wwersjach NMOS rodziny 65xx zostały przekonwertowane na NOP o różnych długościach instrukcji i czasach cyklu w 65C02 . |
PowerPC |
NOP
|
4 | 0x60000000 | (rozszerzony kod operacyjny dla ori r0,r0,0 )
|
Mikrokontroler PIC |
NOP
|
12 bitów | 0b000000000000 |
MOVW 0,W
|
RISC-V |
NOP
|
4 | 0x00000013 |
ADDI x0, x0, 0
|
SPARC |
NOP
|
4 | 0x01000000 | Stojaki, dla sethi 0, %g0 których zeruje się %g0 rejestr
przewodowy do zera |
Z80 |
NOP
|
1 | 0x00 | Istnieje kilka innych instrukcji bez żadnego efektu (w tym samym czasie): LD A, A , LD B, B itd.
|
PDP-10 |
JFCL 0, (standardowy)JUMP, SETA, SETAI, CAI, TRN, TLN
|
1 słowo | 25500******** (ósemkowe) | Skakać nigdy Skakać nigdy, niczego nie ustawiać, nigdy nie skakać |
PDP-11 |
NOP
|
16 bitów | 000240 (ósemkowe) | Usuń żaden z kodów warunków |
VAX |
NOP
|
1 | 0x01 | Opóźnienie zależy od typu procesora |
Z punktu widzenia projektowania sprzętu, niezmapowane obszary magistrali są często projektowane tak, aby zwracały zera; ponieważ zachowanie suwaka NOP jest często pożądane, daje to uprzedzenie do kodowania go za pomocą kodu operacyjnego z samymi zerami.
Kod
Funkcja lub sekwencja instrukcji języka programowania jest instrukcją NOP lub pustą, jeśli nie ma żadnego efektu. W niektórych kontekstach składnia niektórych języków może wymagać instrukcji o wartości null .
Ada
W Ada The null
oświadczenie służy jako NOP. Ponieważ składnia zabrania, aby instrukcje sterujące lub funkcje były puste, null
instrukcja musi być użyta do określenia, że nie jest wymagane żadne działanie. (Tak więc, jeśli programista zapomni napisać sekwencję instrukcji, program się nie skompiluje.)
C i pochodne
Najprostszą instrukcją NOP w C jest instrukcja null , która jest tylko średnikiem w kontekście wymagającym instrukcji.
;
Pusty blok (instrukcja złożona) jest również NOP i może być bardziej czytelny:
{}
W niektórych przypadkach, takich jak treść funkcji, należy użyć bloku, ale może on być pusty. W C instrukcje nie mogą być puste — proste instrukcje muszą kończyć się znakiem ; (średnik), podczas gdy instrukcje złożone są ujęte w {} (nawiasy klamrowe), co samo w sobie nie wymaga następującego średnika. W związku z tym w kontekstach, w których instrukcja jest wymagana gramatycznie, można użyć niektórych takich instrukcji o wartości null.
Instrukcja null sama w sobie jest bezużyteczna, ale może mieć zastosowanie składniowe w szerszym kontekście, np. w kontekście pętli:
while (getchar() != '\n') {}
alternatywnie,
while (getchar() != '\n')
;
lub bardziej zwięźle:
while (getchar() != '\n');
(zauważ, że ostatnia forma może być myląca i jako taka generuje ostrzeżenie w przypadku niektórych kompilatorów lub opcji kompilatora, ponieważ średnik zwykle oznacza instrukcję wywołania funkcji, gdy jest umieszczona po nawiasie na końcu wiersza).
Powyższy kod kontynuuje wywoływanie funkcji getchar(), dopóki nie zwróci znaku \n (nowej linii), zasadniczo przewijając bieżącą lokalizację odczytu standardowego wejścia na początek następnego wiersza.
Fortran
W Fortran The CONTINUE
rachunek jest wykorzystywany w niektórych kontekstach, takich jak ostatnie oświadczenie w pętlę, choć może on być stosowany w dowolnym miejscu, a nie ma żadnego funkcjonalności.
JavaScript
Język JavaScript nie ma wbudowanej instrukcji NOP. Możliwych jest wiele wdrożeń:
- Użyj instrukcji
;
empty lub instrukcji{}
empty block w taki sam sposób, jak w przykładach języka C i pochodnych ; - Użyj wyrażenia
undefined
lubnull
jako pełnej instrukcji (instrukcji wyrażenia ), gdy poprzednie metody nie są dozwolone przez składnię.
Alternatywy w sytuacjach, w których wymagana jest funkcja, to:
- Użyj
Function.prototype()
wbudowanej funkcji, która przyjmuje dowolne argumenty i zwracaundefined
; - Użyj funkcji NOP dostępnej w bibliotece innej firmy — patrz poniżej;
- Zdefiniuj niestandardową funkcję NOP, jak w poniższym przykładzie (używając składni funkcji strzałek ES6 ):
const noop = () => {};
AngularJS
Struktura AngularJS zapewnia funkcję angular.noop, która nie wykonuje żadnych operacji.
jQuery
JQuery biblioteka oferuje funkcję jQuery.noop()
, która nic nie robi.
Lodasza
Lodash biblioteka oferuje funkcję _.noop()
, która zwraca niezdefiniowane i nic nie robi.
Pascal
Podobnie jak w przypadku C, ; używany samodzielnie może być użyty jako instrukcja null w Pascalu . W rzeczywistości, ze względu na specyfikację języka, w bloku BEGIN / END średnik jest opcjonalny przed instrukcją END, więc użyty tam średnik jest zbędny.
Również blok składający się z BEGIN END;
może być użyty jako symbol zastępczy do wskazania braku akcji, nawet jeśli zostanie umieszczony wewnątrz innego bloku BEGIN / END.
Pyton
Język programowania Python zawiera pass
instrukcję, która nie ma żadnego efektu podczas wykonywania i dlatego służy jako NOP. Jest używany głównie do zapewnienia poprawnej składni ze względu na składnię Pythona uwzględniającą wcięcia ; na przykład składnia definicji klasy wymaga wcięcia bloku z logiką klasy, która musi być wyrażona tak, jak pass
powinna być pusta.
Skrypty powłoki (bash, zsh itp.)
Polecenie ' :
' [dwukropek] jest wbudowanym poleceniem powłoki, które ma podobny efekt do "NOP" (operacja nie rób nic). Technicznie nie jest to NOP, ponieważ zmienia specjalny parametr $? (status wyjścia ostatniego polecenia) na 0. Może być uważany za synonim wbudowanego w powłokę 'true', a jego kod zakończenia to prawda (0).
Język makr TeX (ConTeXt, LaTeX itp.)
Polecenie ma język makr systemu typograficznego TeX\relax
. Sam nic nie robi, ale może być użyty, aby uniemożliwić poprzedniemu poleceniu przeanalizowanie kolejnych tokenów.
Polecenia protokołu NOP
Wiele protokołów komputerowych , takich jak telnet , zawiera polecenie NOP, które klient może wydać, aby zażądać odpowiedzi od serwera bez żądania jakichkolwiek innych działań. Takiego polecenia można użyć, aby upewnić się, że połączenie jest nadal aktywne lub że serwer reaguje. Polecenie NOOP jest częścią następujących protokołów ( jest to lista częściowa ):
Należy zauważyć, że w przeciwieństwie do innych wymienionych protokołów, polecenie IMAP4 NOOP ma określony cel — umożliwia serwerowi wysyłanie wszelkich oczekujących powiadomień do klienta.
Podczas gdy większość serwerów telnet lub FTP odpowiada na polecenie NOOP "OK" lub "+OK", niektórzy programiści dodali dziwaczne odpowiedzi do klienta. Na przykład ftpd
demon MINIXa odpowiada na NOOP wiadomością:
200 NOOP to you too!
Pękanie
NOP są często zaangażowane podczas łamania oprogramowania, które sprawdza numery seryjne, określone wymagania sprzętowe lub programowe, obecność lub brak kluczy sprzętowych itp. Proces ten jest realizowany poprzez zmianę funkcji i podprogramów, aby ominąć kontrole bezpieczeństwa i zamiast tego po prostu zwrócić oczekiwaną sprawdzaną wartość dla. Ponieważ większość instrukcji w procedurze sprawdzania bezpieczeństwa będzie nieużywana, zostaną one zastąpione przez NOP, usuwając w ten sposób funkcje bezpieczeństwa oprogramowania bez zmiany położenia wszystkiego, co następuje w pliku binarnym.
Exploity bezpieczeństwa
Opcode NOP może być użyty do utworzenia suwaka NOP , który umożliwia wykonanie kodu, gdy dokładna wartość wskaźnika instrukcji jest nieokreślona (np. gdy przepełnienie bufora powoduje nadpisanie adresu powrotu funkcji na stosie).
Zobacz też
- Architektura komputerowa
- HLT (instrukcja x86) – wstrzymuje procesor
- Halt and Catch Fire – wstrzymuje również procesor
- Funkcja tożsamości – programowanie funkcjonalne odpowiadające NOP
- xyzzy (polecenie) – polecenie czasami używane zamiast NOP
- IEFBR14 – tautologia mainframe
- Tekst wypełniający
- Komentarz (programowanie komputerowe) – adnotacje ogólnie dla programistów, które są ignorowane przez kompilatory i interpretery