NOP (kod) - NOP (code)

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, eaxwe 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, %g0których zeruje się %g0rejestr przewodowy do zera
Z80 NOP 1 0x00 Istnieje kilka innych instrukcji bez żadnego efektu (w tym samym czasie): LD A, A, LD B, Bitd.
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 nulloświadczenie służy jako NOP. Ponieważ składnia zabrania, aby instrukcje sterujące lub funkcje były puste, nullinstrukcja 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 CONTINUErachunek 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 undefinedlub nulljako 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 zwraca undefined;
  • 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 passinstrukcję, 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 passpowinna 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 ftpddemon 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ż

Bibliografia