這個指令在彙編中的作用是空指令,意味著什麼都不做的意思,一般用來控制cpu的時間週期,達到時鐘延時的效果
首先說一下什麼是cpu時鐘:
cpu時鐘:處理器晶元是在特定的時鐘頻率下進行工作的。處理器的速度用時鐘頻率衡量。
其次衡量的單位以赫茲為單位:
首先你要明白什麼是頻率,頻率的單位hz(赫茲)。1hz就是每秒完成乙個週期,10hz是每秒完成10個週期。不過,hz這個單位太小了,通常以khz、mhz或ghz來表示訊號頻率。
1ghz=1000mhz 1mhz=1000khz 1khz=1000hz
如果你的cpu上的單位為1ghz的話意味著你的cpu每秒能完成1000個週期!
每個週期都會通過資料匯流排以及外部匯流排去取資料和處理資料!
有的時候我們想要讓cpu等待一會處理我們的指令,那麼在此期間需要讓cpu在執行我們程式**段時什麼都不做,也就是給定乙個空指令,nop,並且該指令是會自動對齊cpu記憶體定址!
注意程式是不能主動獲取cpu控制權的,是由作業系統分配的,所以當作業系統將cpu的控制權分配給你一段時間,這段時間裡你什麼都不想做的情況下就可以使用該語句,當時間過了之後cpu控制權收回時,作業系統會把程式的**執行狀況儲存到pcb程序控制塊裡,以便下次執行!
關於記憶體對齊詳解:詳解c語言記憶體對齊
乙個週期只能用於一次cpu定址或處理,在彙編標準裡乙個nop是會和cpu架構對齊的,達到記憶體對齊
而乙個時鐘週期只能完成一次定址或處理指令,所以nop也就占用乙個時鐘週期!也就是1us
1us=0.0001s
下面是不同的cpu架構所占用不同的位元組:
cpu架構
助憶碼字長
操作碼備註
intelx86系列cpu
nop1; i686中為1-9
0x90; 0x0f 0x1f [2]
x86 cpu上的nop指令實質上是xchg eax, eax(操作碼同為0x90)–無任何作用的指令。
intel 8051 /mcs-51系列
nop0x00
mips
nop0x00000000
mos科技 65xx
nop0xea
65c02處理器發布時,之前多數的無效指令都被定義成了具有不同字長和需時的nop指令。
powerpc
nop0x60000000 (ori r0,r0,0的擴充套件操作碼)
此外其實在c/c++編譯器裡;即意味著nop空指令什麼都不做,但也被編譯器用來作為分割符!
當我們在一些帶有作用域"{}「的語句裡使用」;「時,編譯器會把」;"視為nop指令什麼都不做,同時也作為這段語句的結束,也就是這個語句塊什麼都不做,那麼編譯器就不會去編譯這段**,但是不會新增nop指令,來占用cpu時鐘週期!因為這樣做會降低cpu執行效率!
列如:while語句是帶有作用域的語句,如果你在while後面加上;編譯器則視為該語句只迴圈,但迴圈體裡什麼都不做
while(true);
其效果與:
while(true)
是一樣的,但是編譯速度要快於while(true){},因為編譯器還要檢查作用域裡是否有語句,在做相應的編譯!
大多數情況下該語句都用於破解它人程式:
列如如下判斷:
if(0 == i)
只有在i=0的前提下才會執行printf("i0」);這條語句,但是我們可以使用一些反編譯工具將if判斷語句填充為nop指令,讓其什麼都不做,然後無條件的執行printf(「i==0」)這條語句,也就是if語句被nop填充之後,if語句就失效了,無效了,那麼if語句作用域下的語句會被無條件執行!
一般用於破解它人要求驗證的程式,同時我們無需考慮記憶體對齊cpu定址的問題,因為使用nop指令的位元組占用是與cpu對應的!這個在填充時取決於你反編譯程式所使用的是哪個架構的指令集!
因為上面也說了,在不同的架構上nop指令長度不同,所以占用位元組也不一樣!
置於cpu是怎樣知道這段指令是nop指令呢?
cpu處理指令的過程:
計算機每執行一條指令都可分為三個階段進行。即取指令-----分析指令-----執行指令。
取指令的任務是:根據程式計數器pc中的值從程式儲存器讀出現行指令,送到指令暫存器。
分析指令階段的任務是:將指令暫存器中的指令操作碼取出後進行解碼(通過解碼器),分析其指令性質。如指令要求運算元,則尋找運算元位址。
計算機執行程式的過程實際上就是逐條指令地重複上述操作過程,直至遇到停機指令可迴圈等待指令。
解碼器:是將取得的二進位制指令,通過cpu架構裡提供的指令集庫分析指令要做什麼,比如mov ax,0e0h,其機器碼為「01101011」,意思為將eoh值送入ax暫存器,那麼解碼器會翻譯成對應的電平脈衝訊號,讓cpu去處理!
空操作NOP指令在ARM和C51的區別
一 c51呼叫方法 include nop 二 arm下呼叫方法 asm void nop void 然後在之後的c 中呼叫該函式 void main 關於nop指令 在mcs 51微控制器指令集中nop的指令碼為0x00,而arm指令集中的nop是一條偽指令,編譯系統用一條mov指令替代其執行。n...
微控制器中的NOP指令
在微控制器中的很多程式中都能看見nop這條指令的身影,有些人很疑惑這條空空的指令到底有什麼用呢,經過多次的實驗,我終於證實 呀,誰扔的番茄 主要有兩條作用 1,精確定時 nop指令時間為1個週期,12m晶振的活呢是1us秒的時間。非常的準確。如 如果晶振用12mz的話,這樣乙個機器週期為1us。mo...
dockerfile指令介紹
dockerfile指令 cmd,entrypoint,add,copy,volume,workdir,user,onbuild,env等 1.cmd 用於指定乙個容器啟動時要執行的命令。類似於run指令,只是run指令是指定映象被構建時的命令,而cmd是指容器被啟動時要執行的命令 docker r...