1、作用是空指令(什么都不做),一般用来控制CPU的时间周期,达到时钟延时的效果
2、如果想要让CPU等待一会处理指令,那么在此期间需要让CPU在执行我们程序代码段时什么都不做,也就是给定一个空指令NOP,该指令是会自动对齐CPU内存寻址!
注意程序是不能主动获取CPU控制权的,是由操作系统分配的,所以当操作系统将CPU的控制权分配给你一段时间,这段时间里你什么都不想做的情况下就可以使用该 语句,当时间过了之后CPU控制权收回时,操作系统会把程序的代码执行状况保存到PCB进程控制块里,以便下次执行
3、其实在C/C++编译器里;即意味着NOP空指令什么都不做,但也被编译器用来作为分割符!
当我们在一些带有作用域"{}"的语句里使用";"时,编译器会把";"视为NOP指令什么都不做,同时也作为这段语句的结束,也就是这个语句块什么都不做,那么编译器就 不会去编译这段代码,但是不会添加NOP指令,来占用CPU时钟周期!因为这样做会降低CPU运行效率!例如:wile(1);
4、一般用于破解它人要求验证的程序(用一些反编译工具将判断语句填充为nop指令,让其什么都不做,然后无条件的执行),同时我们无需考虑内存对齐CPU寻址的问 题,因为使用NOP指令的字节占用是与CPU对应的!这个在填充时取决于你反编译程序所使用的是哪个架构的指令集!
4、下面是不同的CPU架构所占用不同的字节:
CPU架构 | 助忆码 | 字长 | 操作码 | 备注 |
Intelx86系列CPU | NOP | 1; i686中为1-9 | 0x90; 0x0f 0x1f [2] | x86 CPU上的NOP指令实质上是XCHG EAX, EAX(操作码同为0x90)--无任何作用的指令。 |
Intel 8051 /MCS-51系列 | NOP | 1 | 0x00 | |
MIPS | NOP | 4 | 0x00000000 | |
MOS科技 65xx | NOP | 1 | 0xea | 65C02处理器发布时,之前多数的无效指令都被定义成了具有不同字长和需时的NOP指令。 |
PowerPC | NOP | 4 | 0x60000000 (ori r0,r0,0的扩展操作码) | |