我正在经历MSIL,并注意到MSIL中有很多nop指令。
MSDN文章说,如果对操作码进行了修补,它们将不采取任何措施,并被用于填充空间。在调试版本中使用的版本比发行版本更多。
我知道在汇编语言中会使用这些类型的语句来对齐后面的指令,但是为什么在MSIL中需要MSIL nop?
(编者注:可接受的答案是关于机器代码NOP的,而不是问题最初询问的MSIL / CIL NOP。)
我正在经历MSIL,并注意到MSIL中有很多nop指令。
MSDN文章说,如果对操作码进行了修补,它们将不采取任何措施,并被用于填充空间。在调试版本中使用的版本比发行版本更多。
我知道在汇编语言中会使用这些类型的语句来对齐后面的指令,但是为什么在MSIL中需要MSIL nop?
(编者注:可接受的答案是关于机器代码NOP的,而不是问题最初询问的MSIL / CIL NOP。)
Answers:
NOP有几个用途:
这是调试如何使用MSIL / CIL nops(不是x86机器代码nop
)的方法:
语言编译器(C#,VB等)使用Nops定义隐式序列点。这些告诉JIT编译器在哪里确保可以将机器指令映射回IL指令。
Rick Byer在DebuggingModes.IgnoreSymbolStoreSequencePoints上的博客条目解释了一些细节。
C#还将Nops置于呼叫指示之后,以便源中的返回站点位置是呼叫,而不是呼叫之后的行。
它为代码中的基于行的标记(例如断点)提供了机会,而发布版本不会发出任何标记。
NOP-Slides有点不合常规,用于缓冲区溢出漏洞利用。
它们的一种经典用法是使调试器始终可以将源代码行与IL指令相关联。
我使用NOP来自动调整进入ISR后累积的延迟。非常方便地把握时机。