nop指令的作用:
1)就是通过nop指令的填充(nop指令一个字节),使指令按字对齐,从而减少取指令时的内存访问次数。(一般用来内存地址偶数对齐,比如有一条指令,占3字节,这时候使用nop指令,cpu 就可以从第四个字节处读取指令了。)
2)通过nop指令产生一定的延迟,但是对于快速的CPU来说效果不明显,可以使用rep前缀,多延迟几个时钟;-->具体应该说是占用了3个时钟脉冲!
3)i/o传输时,也会用一下 nop,等待缓冲区清空,总线恢复;
4)清除由上一个算术逻辑指令设置的flag位;
5)破解:)对于原程序中验证部分使用nop来填充,使验证失效;
6)有一个朋友说的比较厉害--在航天飞机控制程序中防止程序跳飞!
解释如下:在空间放射性环境下,放射性子粒很容易使内存位元改变(呵呵,有点基因突变的感觉),这样如果改变的是jump,call指令的存贮位置的话,就会导致程序跳转到一个不可以预置的位置,对于关键系统来说的确是灾难性的。所以就在被调用程序之前填充nop指令,这样即使跳转到稍前或者稍后的位置,也不会造成影响。
这让我想起《C Traps and Pitfalls》中举的那个导弹软件中的致命错误:因为导弹是以0.1s为单位进行记时的,但是由于浮点数没有办法精确的表示0.1,造成了舍尾误差,这个误差在导弹开启3天的之后逐渐的积累,结果误差了一秒。
以下来自http://wapedia.mobi/zh/NOP
计算机科学中,NOP或NOOP(No Operation或No Operation Performed的缩写,意为无操作)是汇编语言的一个指令,一系列编程语句,或网络传输协议中的表示不做任何有效操作的命令。
目录:
1. NOP机器指令
2. NOP代码
3. NOP协议命令
4. 破解
5. 安全问题
6. 参见
7. 参考文献
1. NOP机器指令
有的计算机指令集包含一条指令,其主要目的是不改变任何程序可访问的寄存器,处理器状态标志或主存,而且可能需要特定的时钟周期来执行。在其它指令集中,NOP是用执行一条具有操作数,具有相同效果的指令来模拟的(例如SPARC处理器推荐使用sethi 0, %g0模拟NOP)。
NOP指令通常用于控制时序的目的,强制内存对齐,防止流水线灾难(en:Hazard (computer architecture)),占据分支指令造成的延迟(delay slot),或是作为占位符以供程序的改善(或替代被移除的指令)。在某些情况中,NOP指令会产生副作用;例如在摩托罗拉 68000处理器中,NOP操作码会产生流水线同步。
下表显示了部分CPU架构上NOP指令的特征:
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 |
|
< |