NOP (code): Difference between revisions
Incnis Mrsi (talk | contribs) Undid revision 546321576 by 2A00:5A80:FFFF:1:8C9C:13E4:7A05:762C (talk) |
|||
Line 147: | Line 147: | ||
=== Perl === |
=== Perl === |
||
The [[Perl]] |
The [[Perl]] language has the [http://search.cpan.org/~jesse/perl-5.12.0/pod/perlop.pod#Yada_Yada_Operator yada-yada operator] '...' which has been added to the syntax to visually represent missing code that is to be added at a later date. |
||
== NOP protocol commands == |
== NOP protocol commands == |
Revision as of 16:45, 22 March 2013
In computer science, NOP or NOOP (short for No Operation) is an assembly language instruction, sequence of programming language statements, or computer protocol command that effectively does nothing at all.
NOP machine instruction
Some computer instruction sets include an instruction whose explicit purpose is not to change the state of any of the programmer accessible registers, status flags, or memory and which may require a specific number of clock cycles to execute. In other instruction sets, a NOP has to be simulated by executing an instruction having operands that cause the same effect (e.g., on the SPARC processor, the instruction sethi 0, %g0
is the recommended solution).
A NOP is most commonly used for timing purposes, to force memory alignment, to prevent hazards, to occupy a branch delay slot, or as a place-holder to be replaced by active instructions later on in program development (or to replace removed instructions when refactoring would be problematic or time-consuming). In some cases, a NOP can have minor side effects; for example, on the Motorola 68000 series of processors, the NOP opcode causes a synchronization of the pipeline.[1]
Here are the characteristics of the NOP instruction for some CPU architectures:
CPU architecture | Mnemonic | Bytes | Opcode | Notes |
---|---|---|---|---|
Intel x86 CPU family | NOP
|
1; 1–9 for i686 | 0x90; 0x0f 0x1f[2] | |
Intel 8051 / MCS-51 family | NOP
|
1 | 0x00 | |
ARM | NOP
|
4 | 0x00000000 | This stands for andeq r0, r0, r0 which has no effect. The assembly instruction nop will most likely expand to mov r0, r0 which is encoded 0xE1A00000.[3] |
Thumb-2 (16 bit) | NOP
|
2 | 0xbf00 | |
Thumb-2 (32 bit) | NOP
|
4 | 0xf3af 1000 | |
AArch64 (64 bit) | NOP
|
4 | 0xd503201f | |
MIPS | NOP
|
4 | 0x00000000 | Stands for sll r0,r0,0
|
MIPS-X | NOP
|
4 | 0x60000019 | (extended opcode for add r0,r0,r0 )
|
MMIX | SWYM
|
4 | 0xfd****** | SWYM stands for “Sympathize with your machinery.” The * digits can be chosen arbitrarily. |
Motorola 68000 family | NOP
|
2 | 0x4e71 | This synchronizes the pipeline and prevents instruction overlap.[1] |
MOS Technology 65xx | NOP
|
1 | 0xea | NOP consumes two clock cycles. Undefined opcodes in the NMOS versions of the 65xx family were converted to be NOPs of varying instruction lengths and cycle times in the 65C02. |
PowerPC | NOP
|
4 | 0x60000000 | (extended opcode for ori r0,r0,0 )
|
PIC microcontroller | NOP
|
12 bits | 0b000000000000 | |
SPARC | NOP
|
4 | 0x01000000 | |
Z80 | NOP
|
1 | 0x00 | There are some other instructions without any effect (and the same timing): LD A, A , LD B, B etc.
|
From a hardware design point of view, unmapped areas of a bus are often designed to return zeroes; since the NOP slide behavior is often desirable, it gives a bias to coding it with the all-zeroes opcode.
NOP code
NOP is sometimes used as a description for the action performed by a function or a sequence of programming language statements if the function or code has no effect (it might also be called redundant code). A common compiler optimization is the detection and removal of this kind of code. Such code may be required by the grammar of the programming language, which does not allow a blank.
C
The following is an example of a single C statement that behaves like a NOP (the issue is whether the statement affects program output, not whether or not a compiler generates any code for this statement):
i+1;
This statement performs an addition and discards the result. Indeed, any statement without side effects (and that does not affect control flow, e.g., break, return) can be removed, as the result of the computation is discarded.
The simplest possible statement in C that behaves like a NOP is the so called null statement, which is just a semi-colon in a context requiring a statement. (A compiler is not required to generate a NOP instruction in this case; typically, no instructions whatsoever would be generated.)
;
Alternatively, an empty block (compound statement) may be used, and may be more legible:
{}
In some cases, such as the body of a function, a block must be used, but this can be empty. In C, statements cannot be empty – simple statements must end with a ; (semicolon) while compound statements are enclosed in {} (braces), which does not itself need a following semicolon. Thus in contexts where a statement is grammatically required, some such null statement can be used.
One common NOP sequence that behaves like a single-line statement (and hence can be used in the context of a single-line if/else branch) is do {} while(0), for example:
#define DO_NOTHING() do { } while(0) if(i == 2) DO_NOTHING(); else i++
The null statement is useless by itself, but it can have a syntactic use in a wider context, e.g., within the context of a loop:
while (ReadChar() != '\n') ;
alternatively, and perhaps more legibly:
while (ReadChar() != '\n') {}
or more tersely:
while (ReadChar() != '\n');
though this latter is potentially confusing, as the semicolon is easily overlooked.
The above code continues calling the function ReadChar until it returns a \n (newline) character.
Python
The Python programming language has a pass
statement which has no effect when executed and thus serves as a NOP. It is primarily used to ensure correct syntax due to Python's indentation-sensitive syntax; for example the syntax for definition of a class requires an indented block with the class logic, which has to be expressed as pass
when it should be empty.
Perl
The Perl language has the yada-yada operator '...' which has been added to the syntax to visually represent missing code that is to be added at a later date.
NOP protocol commands
Many computer protocols, such as telnet, include a NOP command that a client can issue to request a response from the server without requesting any other actions. Such a command can be used to ensure the connection is still alive or that the server is responsive. A NOOP command is part of the following protocols (this is a partial list):
- telnet
- FTP
- SMTP
- X11
- POP3
- NNTP
- finger
- IMAP4
- BitTorrent
- Character encoding: the null control character
Note that unlike the other protocols listed, the IMAP4 NOOP command has a specific purpose - it allows the server to send any pending notifications to the client.
While most telnet or FTP servers respond to a NOOP command with "OK" or "+OK", some programmers have added quirky responses to the client. For example, the ftpd
daemon of MINIX responds to NOOP with the message:[4]
200 NOOP to you too!
Cracking
NOPs are often involved when cracking software that checks for serial numbers, specific hardware or software requirements, presence or absence of hardware dongles, etc. This is accomplished by altering functions and subroutines to bypass security checks and instead simply return the expected value being checked for. Because most of the instructions in the security check routine will be unused, these would be replaced with NOPs, thus removing the program's functionality without attracting any attention.
Security exploits
The NOP opcode can be used to form a NOP sled, which allows code to execute when the exact value of the instruction pointer is indeterminate (e.g., when a buffer overflow causes a function's return address on the stack to be overwritten).
See also
- Computer architecture
- HLT
- Instruction set
- x86
- PPC
- Identity function, the functional programming equivalent to NOOP
- xyzzy, a command sometimes used instead of NOOP
- IEFBR14
- Filler text
References
- ^ a b "Motorola 68000 Programmer's Reference Manual" (PDF).
- ^ "Intel 64 and IA-32 Architectures Software Developer's Manual: Instruction Set Reference A-Z" (PDF). Retrieved 2012-03-01.
- ^ ARM Information Center - nop
- ^ "ftpd.c". Retrieved 2009-01-22.