NOP (kód) - NOP (code)
Strojový kód |
---|
Obecné pojmy |
Instrukce |
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, eax ve 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, %g0 které se vynuluje %g0 registr
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, B atd.
|
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 null
prohlášení slouží jako NOP. Jelikož syntaxe zakazuje, aby řídicí příkazy nebo funkce byly prázdné, null
musí 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 CONTINUE
pří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
undefined
nebonull
jako ú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 Python má pass
pří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 pass
by 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á \relax
pří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 ftpd
dé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é
- Počítačová architektura
- HLT (instrukce x86) - pozastaví CPU
- Halt and Catch Fire - také pozastaví CPU
- Funkce identity - funkční programování ekvivalentní NOP
- xyzzy (příkaz) - příkaz někdy používaný místo NOP
- IEFBR14 - tautologie sálových počítačů
- Výplňový text
- Komentář (počítačové programování) - poznámky obecně pro programátory, které kompilátory a tlumočníci ignorují