[英]How does asm(“nop”); works?
我从http://en.wikipedia.org/wiki/NOP中删除了这个定义,但我仍然需要一个更简单的定义。
我偶然发现了一个代码,我不确切知道它的作用:
switch (Something)
{
case this_one:
asm ("nop");
break;
case other_one:
asm ("nop");
break;
default:
asm ("nop");
break;
}
nop
是一个无需任何操作的汇编指令 - 尽可能接近任何事情并仍然执行机器指令,这意味着(可能)真正的微小时间过去(在某些实时应用程序中可能具有有限的价值)。
在这种情况下,语句asm("nop");
对程序没有任何语义差异。 我认为它可能存在的唯一原因是“强制”编译器不折叠代码路径,如果你查看目标代码或反汇编机器代码或查看它,使switch语句的机器结构可见一个调试器。
NOP
对于调试很有用。 即使什么也不做因为“无操作”, NOP
就是你可以在调试器中设置断点的指令。 我相信程序员想以这种方式学习“Something”的价值。 它看起来很愚蠢,但一位经验丰富的程序员需要花费数小时才能找到原因
if(Something);
{
...
}
总是在范围内,而不是取决于Something
价值。 我怀疑有人现在有类似的问题与switch()。 如果程序员省略了NOP
,编译器可以更容易地删除整个switch()
语句。 我也使用__asm__("#start");
从IOS / iPad / iPhone的最高速度为某些代码制作清晰的边框,但__asm__("nop");
也会这样做。
同样已经说过,它可以用于实时应用程序。 例如http://www.rickard.gunee.com/projects/video/pic/tetris.php可能会使用此功能。
NOP是一个汇编指令,意思是(没有操作),因为它说它不做任何事情,但它像任何其他指令一样由CPU处理。 所以这意味着它将从内存中重新加载,将增加指令指针,但在指令解码后的执行阶段,其他任何事情都不会完成。 它在反向工程中经常被破解者使用,但不知道它将具有的其他用途。 我认为在C编程中不需要使用NOP指令。
由于没有人提到它, nop
对于在关键部分期间“产生”也是有用的,即允许发生其他中断以便减少由关键部分引起的中断延迟。
这通常适用于没有操作系统的嵌入式应用程序,在这些操作系统中,您经常需要在关键部分中轮询变量和/或状态寄存器。
在许多RISC处理器(ARM,AVR)上,紧接中断取消屏蔽后的指令仍将被屏蔽,因此如果您只是将sei
/ cli
放在一起,则不会允许任何中断发生。
在sei
和cli
之间添加的每个nop
允许在关键部分恢复之前再发生一次中断。
如前所述,它在嵌入式世界中有用。 有时你需要等待一两个循环,然后才能将引脚实际设置为某种状态,尤其是某些传感器等等......在6581 cpu的旧石器时代,nop用于产生延迟,因为时钟是关于0.7mhz ......关于中断的说法也是如此。
在Intel x86至少,nop是xchg eax,eax
的助记符,因此它与自己交换eax寄存器。 还有其他形式做同样的事情,但占用更多空间(例如, lea esi,[esi + eiz]
- 将esi加0),但这些不是“官方”nop指令。
nop
是一种什么都不做的计算机指令。 在这种特殊情况下,可能会阻止开关被优化掉。 这是针对编译器的最佳实现,因为没有什么能阻止它解析和优化asm
语句。
为什么会这样做? 它可能用于以某种方式测试机器代码生成。 从功能上讲,它没用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.