asm("nop")怎么样; 作品?

Ale*_*anu 14 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;
    }
Run Code Online (Sandbox Code Playgroud)

Dwa*_*ell 16

nop 是一个什么都不做的汇编指令 - 尽可能接近于任何东西,仍然执行机器指令,这意味着(可能)真正的微小时间过去(在某些实时应用程序中可能具有有限的价值).

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

  • nop在实时功能中很有用. (3认同)
  • @AlexandruCimpanu:编译器(很可能)不会优化掉asm()指令,因为他没有查看它的参数.一个简单的休息可以优化. (2认同)
  • @PMF:嗯,nop 产生一条指令,空的 asm 语句没有产生...... (2认同)

Tõn*_*uel 6

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可能会使用此功能.

  • 这个案子很多年前是真实的.也许海湾合作委员会没有发出警告,我不记得了.人们也有时候累了等等. (2认同)

kur*_*eko 6

由于没有人提及,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 指令。


Dar*_*ess 5

如前所述,它在嵌入式世界中有用途。有时你需要等待一两个周期,才能真正将引脚设置为某种状态,尤其是在某些传感器上,等等……在 6581 cpu 的旧石器时代,nop 用于产生延迟,因为时钟大约是0.7mhz...关于中断的说法也是正确的。