NOP空指令介紹

2021-10-09 08:58:05 字數 2298 閱讀 8122

這個指令在彙編中的作用是空指令,意味著什麼都不做的意思,一般用來控制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...