asm(“nop”)怎么样;作品?

时间:2014-06-23 06:27:24

标签: c assembly

我从http://en.wikipedia.org/wiki/NOP重新定义了这个定义,但我仍然需要一个更简单的定义。

我偶然发现了一个代码,我不确切知道它的作用:

switch (Something)
    {

        case this_one:
            asm ("nop");
            break;
        case other_one:
            asm ("nop");
            break;
        default:
            asm ("nop");
            break;
    }

6 个答案:

答案 0 :(得分:16)

nop是一个汇编指令,它什么都不做 - 尽可能接近于什么,仍然可以执行机器指令,这意味着(可能)真正的一点点时间(可能有)某些实时应用程序中的价值有限。

在这种情况下,语句asm("nop");对程序没有语义差异。我认为它可能存在的唯一原因是“强制”编译器不折叠代码路径,如果你查看目标代码或反汇编机器代码或查看它,使switch语句的机器结构可见调试器。

答案 1 :(得分:6)

NOP对调试很有用。即使什么都不做因为没有操作",NOP是关于你可以在调试器中设置断点的指令。我相信程序员想要学习" Something"这条路。它看起来很愚蠢但是一位经验丰富的程序员需要花费数小时才能找到原因

if(Something);
{
 ...
}

总是在范围内,而不是取决于Something的值。我怀疑有人现在有类似的问题与switch()。如果程序员省略NOP,编译器可能更容易删除整个switch()语句。我还使用__asm__("#start");Maximum speed from IOS/iPad/iPhone中的某些代码创建了明确的边框,但__asm__("nop");也会这样做。

同样已经说过,它可以用于实时应用程序。例如,http://www.rickard.gunee.com/projects/video/pic/tetris.php可能会使用此功能。

答案 2 :(得分:4)

NOP是一个汇编指令,意思是(没有操作),因为它说它什么都不做,但它像任何其他指令一样由CPU处理。 所以这意味着它将从内存中重新加载,将增加指令指针,但在指令解码后的执行阶段,其他任何事情都不会完成。 它在反向工程中经常被破解者使用,但不知道它将具有的另一种用途。 我不认为在C编程中需要使用NOP指令。

答案 3 :(得分:4)

如前所述,它在嵌入式世界中有用。有时你需要等待一两个循环,然后才能将引脚实际设置为某种状态,尤其是某些传感器等等......在6581 cpu的旧石器时代,nop用于产生延迟,因为时钟是关于0.7mhz ......关于中断的说法也是如此。

答案 4 :(得分:2)

至少在Intel x86上,nop是xchg eax,eax的助记符,因此它与自身交换eax寄存器。 还有其他形式做同样的事情,但占用更多的空间(例如。lea esi,[esi + eiz] - 将0添加到esi),但这些不是“官方”的nop指令。

答案 5 :(得分:0)

nop是一个什么都不做的计算机指令。在这种特殊情况下,可能会阻止开关被优化掉。这是针对编译器的最佳实现,因为没有什么能阻止它解析和优化asm语句。

为什么会这样做?它可能用于以某种方式测试机器代码生成。从功能上讲,它没用。