繁体   English   中英

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

[英]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放在一起,则不会允许任何中断发生。

seicli之间添加的每个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM