C asm(nop)是如何实现的;作品

C asm(nop)是如何实现的;作品,c,assembly,C,Assembly,我从中删除了定义,但我仍然需要一个更简单的定义 我偶然发现了一个代码,但我不知道它到底是做什么的: switch (Something) { case this_one: asm ("nop"); break; case other_one: asm ("nop"); break; default: asm ("nop"

我从中删除了定义,但我仍然需要一个更简单的定义

我偶然发现了一个代码,但我不知道它到底是做什么的:

switch (Something)
    {

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

nop
是一种汇编指令,它什么也不做,几乎什么也不做,但仍然执行机器指令,这意味着(可能)只需要一点点时间(在某些实时应用程序中可能具有有限的价值)


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

a
nop
是一条不起任何作用的计算机指令。在这种特殊情况下,它可能是为了防止交换机成为optim这充其量是特定于编译器的实现,因为没有任何东西可以阻止它解析和优化
asm
语句


为什么要这样做?它可能是为了测试机器代码生成。从功能上来说,它没有用处。

NOP
对调试很有用。即使因为意味着“无操作”而什么都不做,
NOP
也是关于可以在调试器中设置断点的指令。我相信程序员想了解它的价值这看起来很愚蠢,但一个有经验的程序员花了几个小时才找到原因

if(Something);
{
 ...
}
总是在范围内运行,不依赖于
某物的值。我怀疑现在有人对switch()有类似的问题。如果程序员省略
NOP
,编译器可能更容易删除整个
switch()
语句。我还使用
\uasm\uuuuuu(“\35; start”)
用于为中的某些代码明确边界,但
asm_uuuuuuuuuuuuuuuuuuuuu(“nop”);
也会这样做


同样如前所述,它可以用于实时应用程序。例如,可以使用它。

NOP是一条汇编指令,它的意思是(无操作),正如它所说,它只是不做任何事情,但它与任何其他指令一样由CPU处理。 这意味着它将从内存中读取,将增加指令指针,但在指令解码后的执行阶段,不会执行任何其他操作。 它是经常使用的饼干在反向巧妙,但不知道其他用途,它将有。
我认为在C编程中不需要使用NOP指令。

至少在英特尔x86上,NOP是
xchg eax、eax的助记符,因此它与自身交换eax寄存器。

还有其他一些形式做同样的事情,但占用了更多的空间(例如,
lea-esi,[esi+eiz]
-将0添加到esi),但这些不是“官方”的nop指令。

因为没有人提到它,
nop
也可以用于“产量”“在临界段期间,即允许发生其他中断,以减少临界段引起的中断延迟

这在没有操作系统的嵌入式应用程序中非常有用,因为在关键部分,您通常必须轮询变量和/或状态寄存器

在许多RISC处理器(ARM、AVR)上,中断解除屏蔽后立即执行的指令仍将被屏蔽,因此,如果将
sei
/
cli
放在一起,则不允许发生任何中断


sei
cli
之间添加的每个
nop
都允许在关键部分恢复之前再发生一次中断。

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

asm
插入内联汇编,
nop
是一条不起任何作用的指令。代码示例没有任何用处。您对哪部分有困难?您的代码在技术上有困难如果不将它与其他代码位放在上下文中,就很难判断它为什么存在。然而,它可能被用于优化目的——例如保持内存对齐。当内存“对齐”为2个块大小的幂时,一些处理器的性能会更好。从形而上学上讲,没有“无”这样的东西.NOP或NOO操作意味着CPU(最终)会浪费时钟周期。它必须至少对操作进行解码,并注意必须获取一条新指令。此上下文中的“无”表示“程序计数器”寄存器已更改;可能没有其他副作用发生。@AlexandruCimpanu有几个目的,下面的答案中提到了一些。还有一个没有提到的是在连续指令之间插入延迟>ε(如果代码使用硬件,可能需要)就我个人而言,我经常使用asm NOP来调试代码,因为代码中有一个断点。在代码中使用
asm(“NOP”);
和只保留
break
,两者之间有什么区别?@AlexandruCimpanu:编译器(很可能)不会优化掉asm()指令,因为他不看它的参数。一个简单的中断可以被优化掉。@PMF:我认为你不需要一个
nop
。一个空的
易失性asm(“,,,,,,,,,,,,,,,,,,”
语句应该可以做到这一点。@DwayneTowell:nop在代码生成中也很有用,可以提供对齐(例如,跳转目标和函数入口点)。您也可以使用nop为调试留出空间——您可以将跳转插入nop块并热修复您的代码…@PMF:嗯,nop生成一条指令,空的asm语句不生成任何指令……实际上,我想我没有见过一个编译器敢于优化一条指令