NOP
閱讀設定
想搵體育組織嘅話,請睇國家奧林匹克委員會。
NOP(no operation)係組合語言當中嘅指令,叫部電腦乜嘢都唔好做,亦都指機械語言嘅對應機械碼。佢嘅主要用途有兩個——一係用嚟楔位,二係用嚟食時間——但係喺某啲處理器另外可能會有其他副作用(如果有副作用就唔係真係乜都唔做)。
楔位主要係針對直接用機械語言寫嘅程式:如果寫咗嘅邏輯有啲想改走,可以用 NOP 冚走佢;或者寫之前用 NOP 清空將會寫嘢嘅地方,等反組合嘅時候唔好出咁多亂碼。
佢可以用嚟食時間係因為 NOP 雖然唔做嘢,但係處理器仍然要用一定嘅時間嚟處理佢。如果個處理器唔將執行嘅機械碼做最佳化,一段機械碼行幾耐係會計得出,咁將 NOP 擺喺一個廻圈入面就可以將廻圈運行嘅時間拖長。呢種叫做 timing loop(計時廻圈),可以用 6502 處理器做實例:
機械語言 | 組合語言 | 所用時間[註 2] | |||||
---|---|---|---|---|---|---|---|
行動碼 | 運算值 | 意思 | 標籤 | 行動碼 | 運算值 | 注釋 | |
A2 | FF | 將常數 $FF 載入暫存器 X | LDX | #$FF | 2 | ||
EA | 乜嘢都唔好做(齋食時間) | LOOP: | NOP | 2 | |||
CA | 暫存器 X 減一 | DEX | 2 | ||||
D0 | FC | 唔係零就向後跳4個字節 | BNE | LOOP | ; 唔係零就跳去 LOOP | 3(X ≠ 0)或者 2(X = 0) |
廻圈由 255 掉轉數數到 1,總共 255 次。6502 嘅速度係 1 MHz,所以行呢個廻圈用嘅時間係 微秒。如果用兩個 NOP 會用 2296 微秒,三個 NOP 用 2806 微秒,如此類推。
其他語言
[編輯]喺其他語言或者其他語境,如果講某個命命等同 「乜嘢都冇做」,通常會寫 no-op,唔寫 NOP。
註
[編輯]- ↑ 所有數字都係十六進制,喺 6502 嘅語法 $ 表示十六進制,# 表示立即定址(即係運算值係常數)
- ↑ 例子假設所有機械碼都喺同一頁,唔會牽涉到跨頁導致要用多啲時間。所用時間出自 Pickens, John; Clark, Bruce; Spittles, Ed. "NMOS 6502 Opcodes" (英文). 喺2022年10月13號搵到.