1、作用是空指令(什么都不做),一般用來控制CPU的時間周期,達(dá)到時鐘延時的效果
2、如果想要讓CPU等待一會處理指令,那么在此期間需要讓CPU在執(zhí)行我們程序代碼段時什么都不做,也就是給定一個空指令NOP,該指令是會自動對齊CPU內(nèi)存尋址!
注意程序是不能主動獲取CPU控制權(quán)的,是由操作系統(tǒng)分配的,所以當(dāng)操作系統(tǒng)將CPU的控制權(quán)分配給你一段時間,這段時間里你什么都不想做的情況下就可以使用該 語句,當(dāng)時間過了之后CPU控制權(quán)收回時,操作系統(tǒng)會把程序的代碼執(zhí)行狀況保存到PCB進(jìn)程控制塊里,以便下次執(zhí)行
3、其實在C/C++編譯器里;即意味著NOP空指令什么都不做,但也被編譯器用來作為分割符!
當(dāng)我們在一些帶有作用域"{}"的語句里使用";"時,編譯器會把";"視為NOP指令什么都不做,同時也作為這段語句的結(jié)束,也就是這個語句塊什么都不做,那么編譯器就 不會去編譯這段代碼,但是不會添加NOP指令,來占用CPU時鐘周期!因為這樣做會降低CPU運行效率!例如:wile(1);
4、一般用于破解它人要求驗證的程序(用一些反編譯工具將判斷語句填充為nop指令,讓其什么都不做,然后無條件的執(zhí)行),同時我們無需考慮內(nèi)存對齊CPU尋址的問 題,因為使用NOP指令的字節(jié)占用是與CPU對應(yīng)的!這個在填充時取決于你反編譯程序所使用的是哪個架構(gòu)的指令集!
4、下面是不同的CPU架構(gòu)所占用不同的字節(jié):
CPU架構(gòu) | 助憶碼 | 字長 | 操作碼 | 備注 |
Intelx86系列CPU | NOP | 1; i686中為1-9 | 0x90; 0x0f 0x1f [2] | x86 CPU上的NOP指令實質(zhì)上是XCHG EAX, EAX(操作碼同為0x90)--無任何作用的指令。 |
Intel 8051 /MCS-51系列 | NOP | 1 | 0x00 | |
MIPS | NOP | 4 | 0x00000000 | |
MOS科技 65xx | NOP | 1 | 0xea | 65C02處理器發(fā)布時,之前多數(shù)的無效指令都被定義成了具有不同字長和需時的NOP指令。 |
PowerPC | NOP | 4 | 0x60000000 (ori r0,r0,0的擴展操作碼) | |