NOP指令,也称作“空指令”,在x86的CPU中机器码为0x90(144)。
NOP不执行 *** 作,但占一个程序步。执行NOP时并不做任何事,有时可用NOP指令短接某些触点或用NOP指令将不要的指令覆盖。当PLC执行了清除用户存储器 *** 作后,用户存储器的内容全部变为空 *** 作指令。
NOP指令属于PLC指令,使用时会占用执行一个指令的CPU时间片。常用于程序延时或精确计时,不过在较快的CPU上不明显。
扩展资料:
传送指令:
1、包括通用数据传送指令MOV、条件传送指令CMOVcc、堆栈 *** 作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、交换指令XCHG/XLAT/BSWAP、地址或段描述符选择子传送指令LEA/LDS/LES/LFS/LGS/LSS等。
逻辑运算:
1、这部分指令用于执行算术和逻辑运算,包括加法指令ADD/ADC、减法指令SUB/SBB、加一指令INC、减一指令DEC、比较 *** 作指令CMP、乘法指令MUL/IMUL。
2、除法指令DIV/IDIV、符号扩展指令CBW/CWDE/CDQE、十进制调整指令DAA/DAS/AAA/AAS、逻辑运算指令NOT/AND/OR/XOR/TEST等。
移位指令:
1、这部分指令用于将寄存器或内存 *** 作数移动指定的次数。包括逻辑左移指令SHL、逻辑右移指令SHR、算术左移指令SAL、算术右移指令SAR、循环左移指令ROL、循环右移指令ROR等。
位 *** 作:
1、这部分指令包括位测试指令BT、位测试并置位指令BTS、位测试并复位指令BTR、位测试并取反指令BTC、位向前扫描指令BSF、位向后扫描指令BSR等。
参考资料:百度百科-NOP
nop指令的作用:
1)就是通过nop指令的填充(nop指令一个字节),使指令按字对齐,从而减少取指令时的内存访问次数。(一般用来内存地址偶数对齐,比如有一条指令,占3字节,这时候使用nop指令,cpu 就可以从第四个字节处读取指令了。)
2)通过nop指令产生一定的延迟,但是对于快速的CPU来说效果不明显,可以使用rep前缀,多延迟几个时钟;-->具体应该说是占用了3个时钟脉冲!
3)i/o传输时,也会用一下 nop,等待缓冲区清空,总线恢复;
4)清除由上一个算术逻辑指令设置的flag位;
5)破解:对于原程序中验证部分使用nop来填充,使验证失效;
6)有一个朋友说的比较厉害--在航天飞机控制程序中防止程序跳飞!
解释如下:在空间放射性环境下,放射性子粒很容易使内存位元改变(呵呵,有点基因突变的感觉),这样如果改变的是jump,call指令的存贮位置的话,就会导致程序跳转到一个不可以预置的位置,对于关键系统来说的确是灾难性的。所以就在被调用程序之前填充nop指令,这样即使跳转到稍前或者稍后的位置,也不会造成影响。
计算机科学中,NOP或NOOP(No Operation或No Operation Performed的缩写,意为无 *** 作)是汇编语言的一个指令,一系列编程语句,或网络传输协议中的表示不做任何有效 *** 作的命令。
NOP指令通常用于控制时序的目的,强制内存对齐,防止流水线灾难(en:Hazard (computer architecture)),占据分支指令造成的延迟(delay slot),或是作为占位符以供程序的改善(或替代被移除的指令)。在某些情况中,NOP指令会产生副作用;例如在摩托罗拉 68000处理器中,NOP *** 作码会产生流水线同步。
在单片机的C语言编程中,经常需要许多空指令来产生短延迟效应。
很容易做的汇编语言,只写几个空 *** 作。
avr-gcc采用以下方法嵌入组装说明:
Asm(nop”;nop。nop。nop。”:);
在keilC51中,直接调用库函数:
包括//声明void_nop_(void);
_nop_();//生成一个NOP指令
扩展资料:
执行NOP指令只会增加程序计数器1个人电脑,所以需要一个机器周期。实例:MOVLW0xof;将OFH发送到WMOVWFPORT_B;在B端口写W到NOP;空 *** 作MOVFPORT_B,W。
读指令:这三个端口B的连续 *** 作指令的I/O端口,目的是为了写的内容读端口B,需要确保一个稳定的读写之间的时间,所以NOP添加空 *** 作指令。
效果:很短的延迟,需要“_nop_”功能在美国水平,而编译NOP指令延迟的几微秒。NOP指令是单周期指令,延迟时间可以通过晶体振荡器的频率来计算。对于一个12M的晶体振荡器,延迟时间是1uS。
对于一个相对较长的延迟,要求大于10us,使用C51中的loop语句来实现。
在C51中选择loop语句时,要注意以下几点:
首先,在C51中定义了循环变量,尽量使用无符号字符变量。
其次,在FORloop语句中,尝试使用变量-来执行循环。
第三,在while和while语句中,循环体变量也使用了减法。
这是因为在C51编译器中,不同的指令用于不同的循环方法。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)