NOP (kód) - NOP (code)

V počítačové vědě je NOP , no-op nebo NOOP (vyslovováno „no op“; zkratka pro žádnou operaci ) instrukce strojového jazyka a jeho mnemotechnická pomůcka pro sestavení , příkaz programovacího jazyka nebo příkaz počítačového protokolu , který nic nedělá.

Pokyny pro jazyk stroje

Některé počítačové instrukční sady obsahují instrukci, jejímž výslovným účelem je neměnit stav žádného z registrů , stavových příznaků nebo paměti přístupných pro programátory . Spuštění často vyžaduje přesně definovaný počet hodinových cyklů . V jiných sadách instrukcí neexistuje žádná explicitní instrukce NOP, ale mnemotechnický jazyk NOP sestavovacího jazyka představuje instrukci, která funguje jako NOP; například na SPARC , sethi 0, %g0.

NOP nesmí přistupovat k paměti, protože by to mohlo způsobit poruchu paměti nebo poruchu stránky .

NOP se nejčastěji používá pro účely časování, k vynucení zarovnání paměti , k prevenci rizik , k obsazení slotu zpoždění větve , k vyřazení stávající instrukce, jako je skok, jako cíl prováděcí instrukce nebo jako místo- držitele, který bude později při vývoji programu nahrazen aktivními pokyny (nebo nahradit odstraněné pokyny při reorganizaci by bylo problematické nebo časově náročné). V některých případech může mít NOP menší vedlejší účinky; například u procesorů řady Motorola 68000 způsobí NOP operační kód synchronizaci potrubí .

Níže jsou uvedeny pokyny NOP pro některé architektury CPU:

CPU architektura výuka mnemotechnická Bajty Opcode Poznámky
Rodina procesorů Intel x86 NOP 1; 1–9 pro i686 a x86-64 0x 90 0x90 dekóduje na xchg eax, eaxve všech režimech kromě dlouhého režimu , kde operační kód 0x90 stále nemá žádný účinek. Delší kódování je popsáno v příručce společnosti Intel.
Intel 8051 / MCS-51 rodina NOP 1 0x00
ARM A32 NOP 4 0x00000000 To znamená andeq r0, r0, r0 . Montážní instrukce nop se s největší pravděpodobností rozšíří na mov r0, r0, což je zakódováno 0xE1A00000 (architektura malého endianu).
ARM T32 (16 bitů) NOP 2 0xb000 Opcode for ADD SP, #0 - Add zero to the stack pointer (No operation). Sestava instrukce NOP bude s největší pravděpodobností rozšíří do MOV R8, R8 , který je kódován 0x46C0.
ARM T32 (32 bitů) NOP 4 0xF3AF 8000
ARM A64 (64 bitů) NOP 4 0xD503201F
AVR NOP 2 0x0000 jeden hodinový cyklus
IBM System/360 , IBM System/370 , IBM System/390 , z/Architecture , UNIVAC Series 90 NOP 4 0x47000000 nebo 0x470nnnnn nebo 0x47n0nnnn, kde „n“ je jakákoli 4bitová hodnota. NOP („No-Op“) a NOPR („No-Op Register“) jsou podmnožinou pokynů „Branch on Condition“ nebo „Branch on Condition Register“; obě verze mají dvě možnosti pro generování NO-OP.

V případě instrukcí NOP i NOPR je první 0 ve druhém bajtu hodnota „masky“, podmínka pro testování, jako je rovný, nerovný, vysoký, nízký atd. Pokud je maska ​​0, žádná větev nastává.

V případě instrukce NOPR je druhou hodnotou ve druhém bajtu registr, na kterém se má větvit. Pokud je vybrán registr 0, nedojde k žádné větvi bez ohledu na hodnotu masky. Pokud je tedy některá ze dvou hodnot ve druhém bajtu 0, větev se nestane.

V případě instrukce NOP je druhou hodnotou ve druhém bajtu „základní“ registr kombinovaného základního registru, posuvný registr a offsetová adresa. Pokud je základní registr také 0, větev není převzata bez ohledu na hodnotu posunovacího registru nebo adresu posunutí.

NOPR 2 0x0700 nebo 0x070n nebo 0x07n0, kde „n“ je jakákoli 4bitová hodnota.
SuperH NOP 2 0x0009
MIPS NOP 4 0x00000000 Znamená sll r0,r0,0, význam: Logicky posuvný registr 0 nulových bitů doleva a výsledek uložit do registru 0. Zápisy do registru 0 jsou ignorovány; vždy obsahuje 0.
MIPS-X NOP 4 0x60000019 (rozšířený operační kód pro add r0,r0,r0)
SMĚS NOP 1 slovo ± * * * * 0 * Bajty jsou libovolné a mohou být cokoli od 0 do maximálního bajtu (musí být v rozsahu 63-99). MIX používá reprezentaci velikosti znaménka.
MMIX SWYM 4 0xFD ****** SWYM je zkratka pro „Sympatizovat s vaším strojním zařízením“. Číslice * lze zvolit libovolně.
Motorola 68000 rodina NOP 2 0x4E71 Tím se synchronizuje potrubí a zabrání se překrývání instrukcí.
Motorola 6809 NOP 1 0x12
Technologie MOS 65xx (např. 6502 ) NOP 1 0xEA NOP spotřebovává dva hodinové cykly. Nedefinované operační kódy v NMOS verzí rodiny 65xx byly převedeny za NOP různých délek instrukční a doby cyklu v 65C02 .
PowerPC NOP 4 0x60000000 (rozšířený operační kód pro ori r0,r0,0)
Mikrokontrolér PIC NOP 12 bitů 0b00000000000000 MOVW 0,W
RISC-V NOP 4 0x00000013 ADDI x0, x0, 0
SPARC NOP 4 0x01000000 Stojany, pro sethi 0, %g0které se vynuluje %g0registr pevně připojený k nule
Z80 NOP 1 0x00 Tam jsou některé další pokyny, aniž by to mělo vliv (a stejné načasování): LD A, A, LD B, Batd.
PDP-10 JFCL 0, (konvenční)
JUMP, SETA, SETAI, CAI, TRN, TLN
1 slovo 25500 ******* (osmičkové) Skočit nikdy
Skočit nikdy, nic nenastavovat, nikdy přeskočit
PDP-11 NOP 16 bitů 000240 (osmičkové) Vymažte žádný z kódů podmínek
VAX NOP 1 0x01 Zpoždění závisí na typu procesoru

Z hlediska návrhu hardwaru jsou nemapované oblasti sběrnice často navrženy tak, aby vracely nuly; vzhledem k tomu, že chování snímků NOP je často žádoucí, dává zkreslení jeho kódování pomocí operačního kódu se všemi nulami.

Kód

Funkce nebo sekvence příkazů programovacího jazyka je příkaz NOP nebo null, pokud nemá žádný účinek. Syntaxe některých jazyků v určitých kontextech může vyžadovat nulové příkazy .

Ada

V Ada je nullprohlášení slouží jako NOP. Jelikož syntaxe zakazuje, aby řídicí příkazy nebo funkce byly prázdné, nullmusí být příkaz použit k určení, že není vyžadována žádná akce. (Pokud tedy programátor zapomene napsat posloupnost příkazů, program se nepodaří zkompilovat.)

C a deriváty

Nejjednodušší příkaz NOP v jazyce C je příkaz null , což je pouze středník v kontextu vyžadujícím příkaz.

  ;

Prázdný blok (složený příkaz) je také NOP a může být čitelnější:

  {}

V některých případech, například v těle funkce, musí být použit blok, který však může být prázdný. V jazyce C nemohou být příkazy prázdné - jednoduché příkazy musí končit a; (středník), zatímco složené příkazy jsou uzavřeny v {} (složených závorkách), což samo o sobě následující středník nepotřebuje. V kontextech, kde je příkaz gramaticky vyžadován, lze použít nějaký takový nulový příkaz.

Nulový příkaz je sám o sobě k ničemu, ale může mít syntaktické použití v širším kontextu, např. V kontextu smyčky:

  while (getchar() != '\n') {}

alternativně,

  while (getchar() != '\n')
      ;

nebo stručněji:

  while (getchar() != '\n');

)

Výše uvedený kód pokračuje ve volání funkce getchar (), dokud nevrátí znak \ n (nový řádek), což v podstatě rychle posune aktuální místo čtení standardního vstupu na začátek dalšího řádku.

Fortran

Ve Fortranu se CONTINUEpříkaz používá v některých kontextech, jako je poslední příkaz ve smyčce DO, ačkoli jej lze použít kdekoli a nemá žádnou funkci.

JavaScript

Jazyk JavaScript nemá vestavěný příkaz NOP. Možných je mnoho implementací:

  • Použijte ; prázdný příkaz nebo {}prázdný příkaz bloku stejným způsobem jako v příkladech C a derivátů ;
  • Pokud předchozí metody nejsou syntaxí povoleny, použijte výraz undefinednebo nulljako úplný příkaz ( výrazový příkaz ).

Alternativy v situacích, kdy je požadována funkce, jsou:

  • Použijte Function.prototype()vestavěnou funkci, která přijímá všechny argumenty a vrací undefined;
  • Použijte funkci NOP dostupnou v knihovně třetích stran-viz níže;
  • Definujte vlastní funkci NOP, jako v následujícím příkladu (pomocí syntaxe šipkové funkce ES6 ):
const noop = () => {};

AngularJS

Rámec AngularJS poskytuje funkci angular.noop, která neprovádí žádné operace.

jQuery

JQuery knihovna poskytuje funkci jQuery.noop(), která nedělá nic.

Lodash

Lodash knihovna poskytuje funkci _.noop(), která vrací definován a nedělá nic.

Pascal

Stejně jako u C; použitý sám může být použit jako nulový příkaz v Pascalu . Ve skutečnosti kvůli specifikaci jazyka je v bloku BEGIN / END středník volitelný před příkazem END, takže použitý středník je nadbytečný.

Blok sestávající z BEGIN END;může být také použit jako zástupný symbol k označení žádné akce, i když je umístěn uvnitř jiného bloku BEGIN / END.

Krajta

Programovací jazyk Pythonpasspříkaz , který nemá žádný vliv, když je spouštěn, a tak slouží jako NOP. Primárně se používá k zajištění správné syntaxe díky syntaxi citlivé na odsazení Pythonu ; například syntaxe pro definici třídy vyžaduje odsazený blok s logikou třídy, který musí být vyjádřen tak, jako passby měl být prázdný.

Skriptování prostředí (bash, zsh atd.)

Příkaz ' :' [dvojtečka] je vestavěný shell, který má podobný účinek jako "NOP" (operace nedělat nic). Technicky to není NOP, protože mění speciální parametr $? (stav ukončení posledního příkazu) na 0. Může být považováno za synonymum pro shell vestavěný 'true' a jeho stav ukončení je true (0).

Jazyk makra TeX (ConTeXt, LaTeX atd.)

The TeX makrojazyk typografické systému má \relaxpříkaz. Nedělá nic samo o sobě, ale může být použit k zabránění bezprostředně předchozímu příkazu v analýze následujících tokenů.

Příkazy protokolu NOP

Mnoho počítačových protokolů , jako je telnet , obsahuje příkaz NOP, který může klient vydat, aby požadoval odpověď od serveru, aniž by požadoval jakékoli další akce. Takový příkaz lze použít k zajištění, že připojení je stále aktivní nebo že server reaguje. Příkaz NOOP je součástí následujících protokolů ( toto je částečný seznam ):

Všimněte si toho, že na rozdíl od ostatních uvedených protokolů má příkaz IMAP4 NOOP specifický účel - umožňuje serveru odeslat klientovi nevyřízená oznámení.

Zatímco většina serverů telnet nebo FTP reaguje na příkaz NOOP „OK“ nebo „+OK“, někteří programátoři přidali do klienta svérázné odpovědi. Například ftpddémon MINIX reaguje na NOOP zprávou:

200 NOOP to you too!

Praskání

NOP se často podílejí na prolomení softwaru, který kontroluje sériová čísla, specifické hardwarové nebo softwarové požadavky, přítomnost nebo nepřítomnost hardwarových klíčů atd. Tento proces se provádí změnou funkcí a podprogramů, aby se obešly bezpečnostní kontroly a místo toho se jednoduše vrátila očekávaná kontrolovaná hodnota pro. Protože většina pokynů v rutině kontroly zabezpečení bude nepoužita, budou nahrazeny NOP, čímž se odstraní funkce zabezpečení softwaru bez změny umístění všeho, co následuje v binárním souboru.

Bezpečnostní exploity

Operační kód NOP lze použít k vytvoření snímku NOP , který umožňuje spuštění kódu, když je přesná hodnota ukazatele instrukce neurčitá (např. Když přetečení vyrovnávací paměti způsobí přepsání návratové adresy funkce v zásobníku).

Viz také

Reference