NOP (code)_NOP指令作用及解析
摘自:維基百科?NOP (code)
前言
- 在計算機科學中,NOP、no-op 或 NOOP(發音為“no op”;no operation 的縮寫)是一種機器語言指令及其匯編語言助記符、編程語言語句或不執行任何操作的計算機協議命令。
- ?免費的C語言和linuxPDF文檔:傳送門
機器語言指令
- 一些計算機指令集包括一條指令,其明確目的是不改變任何程序員可訪問的寄存器、狀態標志或內存的狀態。 通常需要明確定義的時鐘周期數來執行。 在其他指令集中,沒有明確的 NOP 指令,但匯編語言助記符 NOP 表示作為 NOP 的指令; 例如,在 SPARC 上,[sethi 0,%g0]。
- NOP 不得訪問內存,因為這可能會導致內存錯誤或頁面錯誤。
- NOP 最常用于計時目的,強制內存對齊,防止危險,占用分支延遲槽,使現有指令(例如跳轉)無效,作為執行指令的目標,或作為位置 - 持有者在程序開發后期被活動指令替換(或在重組有問題或耗時時替換已刪除的指令)。 在某些情況下,NOP 可能會產生輕微的副作用; 例如,在 Motorola 68000 系列處理器上,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指令,這樣即使跳轉到稍前或者稍后的位置,也不會造成影響。?這讓我想起《C Traps and Pitfalls》中舉的那個導彈軟件中的致命錯誤:因為導彈是以0.1s為單位進行記時的,但是由于浮點數沒有辦法精確的表示0.1,造成了舍尾誤差,這個誤差在導彈開啟3天的之后逐漸的積累,結果誤差了一秒。————————————————版權聲明:本文為CSDN博主「prettykernel」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/erazy0/article/details/6071281
- 從硬件設計的角度來看,總線的未映射區域通常設計為返回零; 由于 NOP 滑動行為通常是可取的,因此它傾向于使用全零操作碼對其進行編碼。
代碼
- 一個函數或一系列編程語言語句是一個 NOP 或 null 語句,如果它沒有效果。 但在某些上下文中,某些語言的語法可能需要空語句。
在 Ada 中,null 語句用作 NOP。[6] 由于語法禁止控制語句或函數為空,因此必須使用空語句來指定不需要任何操作。 (因此,如果程序員忘記編寫語句序列,程序將無法編譯。)
C和衍生物
C 中最簡單的 NOP 語句是 null 語句,它只是需要語句的上下文中的分號。[譯者添加:空語句可能會被優化]:
;
一個空塊(復合語句)也是一個 NOP,并且可能更清晰:
{}
?在某些情況下,例如函數體,必須使用塊,但塊可以是空的。 在 C 中,語句不能為空——簡單的語句必須以 ; 結尾。 (分號)而復合語句包含在 {}(大括號)中,它本身不需要后面的分號。 因此,在語法上需要語句的上下文中,可以使用一些這樣的空語句。
null 語句本身是無用的,但它可以在更廣泛的上下文中使用語法,例如,在循環的上下文中:
while (getchar() != '\n') {}while (getchar() != '\n'); while (getchar() != '\n');[請注意,最后一種形式可能會令人困惑,因此會在某些編譯器或編譯器選項中生成警告,因為分號通常在行尾括號后表示函數調用指令的結束]。
上面的代碼繼續調用函數 getchar() 直到它返回一個 \n (換行符)字符,實質上是將標準輸入的當前讀取位置快進到下一行的開頭。
Fortran
在 Fortran 中,CONTINUE 語句用于某些上下文,例如 DO 循環中的最后一個語句,盡管它可以在任何地方使用,并且沒有任何功能。?
?JavaScript
JavaScript 語言沒有內置的 NOP 語句。 許多實現是可能的:
在需要功能的情況下,替代方案是:
Python
Python 編程語言有一個 pass 語句,它在執行時沒有任何效果,因此用作 NOP。 由于 Python 的縮進敏感語法,它主要用于確保正確的語法; 例如,定義類的語法需要一個帶有類邏輯的縮進塊,當它應該為空時必須表示為 pass。
NOP 協議命令
-
許多計算機協議,例如 telnet,都包含一個 NOP 命令,客戶端可以發出該命令來請求來自服務器的響應,而無需請求任何其他操作。 這樣的命令可用于確保連接仍然有效或服務器有響應。 NOOP 命令是以下協議的一部分(這是部分列表):?
telnet/FTP/SMTP/X11/POP3/NNTP/finger/IMAP4/BitTorrent
請注意,與列出的其他協議不同,IMAP4 NOOP 命令具有特定用途——它允許服務器向客戶端發送任何掛起的通知。
雖然大多數 telnet 或 FTP 服務器以“OK”或“+OK”響應 NOOP 命令,但一些程序員已向客戶端添加了古怪的響應。 例如,MINIX 的 ftpd 守護進程響應 NOOP 消息:
200 NOOP to you too!
破解
在破解檢查序列號、特定硬件或軟件要求、硬件加密狗的存在與否等的軟件時,NOP 通常會參與其中。 正在檢查的預期值。 因為安全檢查例程中的大多數指令都不會被使用,這些指令將被替換為 NOP,從而刪除軟件的安全功能,而不會改變二進制文件中所有內容的位置。?
安全漏洞 NOP
操作碼可用于形成 NOP 幻燈片,它允許代碼在指令指針的確切值不確定時執行(例如,當緩沖區溢出導致堆棧上的函數返回地址被覆蓋時)。
下面列出了一些 CPU 架構的 NOP 指令:
| Intel?x86?CPU?family | NOP | 1; 1–9 for i686 and x86-64 | 0x90[2] | 0x90 decodes to?xchg eax, eax?in all modes except?long mode, where the opcode 0x90 still has no effect. The longer encodings are described in Intel's manual. |
| Intel?8051?/?MCS-51?family | NOP | 1 | 0x00 | |
| ARM A32 | NOP | 4 | 0x00000000 | This stands for?andeq r0, r0, r0. The assembly instruction?nop?will most likely expand to?mov r0, r0?which is encoded 0xE1A00000 (little-endian architecture).[3] |
| ARM A32 | NOP | 4 | 0x00000000 | 這代表andeq r0, r0, r0。 匯編指令 nop 很可能會擴展為 mov r0, r0,其編碼為 0xE1A00000(小端架構)。 |
| ARM T32?(16 bit) | NOP | 2 | 0xb000 | Opcode for?ADD SP, #0?- Add zero to the stack pointer (No operation). The assembly instruction?nop?will most likely expand to?mov r8, r8?which is encoded 0x46C0.[4] |
| ARM T32?(32 bit) | NOP | 4 | 0xF3AF 8000 | |
| ARM A64?(64 bit) | NOP | 4 | 0xD503201F | |
| AVR | NOP | 2 | 0x0000 | one clock cycle |
| IBM?System/360,? IBM?System/370, ?IBM?System/390, ?z/Architecture,? UNIVAC?Series 90 | NOP | 4 | 0x47000000 or 0x470nnnnn or 0x47n0nnnn where "n" is any 4-bit value. | The NOP ("No-Op") and NOPR ("No-Op Register") are a subset of the "Branch on Condition" or "Branch on Condition Register" instructions, respectively; both versions have two options for generating a NO-OP. In the case of both the NOP and NOPR instructions, the first 0 in the second byte is the "mask" value, the condition to test such as equal, not equal, high, low, etc. If the mask is 0, no branch occurs. In the case of the NOPR instruction, the second value in the second byte is the register to branch on. If register 0 is chosen, no branch occurs regardless of the mask value. Thus, if either of the two values in the second byte is 0, the branch will not happen. In the case of the NOP instruction, the second value in the second byte is the "base" register of a combined base register, displacement register and offset address. If the base register is also 0, the branch is not taken regardless of the value of the displacement register or displacement address. |
| NOPR | 2 | 0x0700 or 0x070n or 0x07n0 where "n" is any 4-bit value. | ||
| SuperH | NOP | 2 | 0x0009 | |
| MIPS | NOP | 4 | 0x00000000 | Stands for?sll r0,r0,0, meaning: Logically shift register 0 zero bits to the left and store the result in register 0 |
| MIPS-X | NOP | 4 | 0x60000019 | (extended opcode for?add r0,r0,r0) |
| MIX | NOP | 1 word | ± * * * * 0 | The * bytes are arbitrary, and can be anything from 0 to the maximum byte (required to be in the range 63-99). MIX uses sign-magnitude representation. |
| MMIX | SWYM | 4 | 0xFD****** | SWYM stands for "Sympathize with your machinery". The * digits can be chosen arbitrarily. |
| Motorola 68000 family | NOP | 2 | 0x4E71 | This synchronizes the?pipeline?and prevents instruction overlap.[1] |
| Motorola 6809 | NOP | 1 | 0x12 | |
| MOS Technology 65xx?(e.g.?6502) | NOP | 1 | 0xEA | NOP?consumes two clock cycles.?Undefined opcodes?in the?NMOS?versions of the 65xx family were converted to be NOPs of varying instruction lengths and cycle times in the?65C02. |
| PowerPC | NOP | 4 | 0x60000000 | (extended opcode for?ori r0,r0,0) |
| PIC microcontroller | NOP | 12 bits | 0b000000000000 | MOVW 0,W |
| RISC-V | NOP | 4 | 0x00000013 | ADDI x0, x0, 0 |
| SPARC | NOP | 4 | 0x01000000 | Stands for?sethi 0, %g0?which zeroes the hardwired-to-zero?%g0?register[5] |
| Z80 | NOP | 1 | 0x00 | There are some other instructions without any effect (and the same timing):?LD A, A,?LD B, B?etc. |
| PDP-10 | JFCL 0,?(conventional) JUMP, SETA, SETAI, CAI, TRN, TLN | 1 word | 25500******* (octal) | Jump never Jump never, set nothing, skip never |
| PDP-11 | NOP | 16 bits | 000240 (octal) | Clear none of the condition codes |
| VAX | NOP | 1 | 0x01 | Delay is dependent on processor type |
- ?從硬件設計的角度來看,總線的未映射區域通常設計為返回零; 由于 NOP 滑動行為通常是可取的,因此它傾向于使用全零操作碼對其進行編碼。
引用:
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的NOP (code)_NOP指令作用及解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设置二进制或者16/32位的某一位的值
- 下一篇: for循环运行流程/步骤