我从http://en.wikipedia.org/wiki/NOP中删除了这个定义,但我仍然需要一个更简单的定义.
我偶然发现了一个代码,我不确切知道它的作用:
switch (Something)
{
case this_one:
asm ("nop");
break;
case other_one:
asm ("nop");
break;
default:
asm ("nop");
break;
}
Run Code Online (Sandbox Code Playgroud)
Dwa*_*ell 16
nop 是一个什么都不做的汇编指令 - 尽可能接近于任何东西,仍然执行机器指令,这意味着(可能)真正的微小时间过去(在某些实时应用程序中可能具有有限的价值).
在这种情况下,该语句asm("nop");对程序没有任何语义差异.我认为它可能存在的唯一原因是"强制"编译器不折叠代码路径,如果你查看目标代码或反汇编机器代码或查看它,使switch语句的机器结构可见一个调试器.
NOP对调试很有用.即使什么都不做因为意味着"无操作",NOP也可以指示你可以在调试器中设置断点.我相信程序员想以这种方式学习"Something"的价值.它看起来很愚蠢,但一位经验丰富的程序员需要花费数小时才能找到原因
if(Something);
{
...
}
Run Code Online (Sandbox Code Playgroud)
总是在内部范围内,而不是取决于价值Something.我怀疑有人现在有类似的问题与switch().如果程序员省略NOP,编译器可能更容易删除整个switch()语句.我还用来__asm__("#start");为IOS/iPad/iPhone的最高速度中的某些代码制作清晰的边框,但__asm__("nop");也会这样做.
同样已经说过,它可以用于实时应用程序.例如http://www.rickard.gunee.com/projects/video/pic/tetris.php可能会使用此功能.
由于没有人提及,nop因此在临界区“屈服”也是有用的,即允许其他中断发生,以减少由临界区引起的中断等待时间。
This is typically useful in embedded applications without operating systems where you often have to poll variables and/or status registers during a critical section.
On many RISC processors (ARM, AVR), the instruction immediately following interrupt unmasking will still be masked, so if you just put sei/cli close together, you won't allow any interrupt to occur.
Each nop added between sei and cli allows one more interrupt to occur before the critical section resumes.
小智 5
至少在 Intel x86 上,nop 是 的助记符xchg eax,eax,因此它与自身交换 eax 寄存器。还有其他形式可以执行相同的操作,但占用更多空间(例如lea esi,[esi + eiz]- 将 0 添加到 esi),但这些不是“官方”nop 指令。
如前所述,它在嵌入式世界中有用途。有时你需要等待一两个周期,才能真正将引脚设置为某种状态,尤其是在某些传感器上,等等……在 6581 cpu 的旧石器时代,nop 用于产生延迟,因为时钟大约是0.7mhz...关于中断的说法也是正确的。