日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NOP (code)_NOP指令作用及解析

發布時間:2024/4/13 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 語句。 許多實現是可能的:

  • 使用 ; 空語句 或 {} 空塊語句與 C 和派生示例中的方式相同;
  • 當語法不允許使用前面的方法時,使用 undefined 或 null 表達式作為完整語句(表達式語句)。
  • 在需要功能的情況下,替代方案是:

  • 使用 Function.prototype() 內置函數,它接受任何參數并返回 undefined;[8]
  • 使用第三方庫中可用的 NOP 函數——見下文;
  • 定義一個自定義的 NOP 函數,如下例所示(使用 ES6 箭頭函數語法):
  • const noop = () => {};

    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 指令:

    CPU architectureInstruction?mnemonicBytesOpcodeNotes
    Intel?x86?CPU?familyNOP1; 1–9 for i686 and x86-640x90[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?familyNOP10x00
    ARM A32NOP40x00000000This 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 A32NOP40x00000000這代表andeq r0, r0, r0。 匯編指令 nop 很可能會擴展為 mov r0, r0,其編碼為 0xE1A00000(小端架構)。
    ARM T32?(16 bit)NOP20xb000Opcode 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)NOP40xF3AF 8000
    ARM A64?(64 bit)NOP40xD503201F
    AVRNOP20x0000one clock cycle

    IBM?System/360,?

    IBM?System/370,

    ?IBM?System/390,

    ?z/Architecture,?

    UNIVAC?Series 90

    NOP40x47000000 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.

    NOPR20x0700 or 0x070n or 0x07n0 where "n" is any 4-bit value.
    SuperHNOP20x0009
    MIPSNOP40x00000000Stands for?sll r0,r0,0, meaning: Logically shift register 0 zero bits to the left and store the result in register 0
    MIPS-XNOP40x60000019(extended opcode for?add r0,r0,r0)
    MIXNOP1 word± * * * * 0The * 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.
    MMIXSWYM40xFD******SWYM stands for "Sympathize with your machinery". The * digits can be chosen arbitrarily.
    Motorola 68000 familyNOP20x4E71This synchronizes the?pipeline?and prevents instruction overlap.[1]
    Motorola 6809NOP10x12
    MOS Technology 65xx?(e.g.?6502)NOP10xEANOP?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.
    PowerPCNOP40x60000000(extended opcode for?ori r0,r0,0)
    PIC microcontrollerNOP12 bits0b000000000000MOVW 0,W
    RISC-VNOP40x00000013ADDI x0, x0, 0
    SPARCNOP40x01000000Stands for?sethi 0, %g0?which zeroes the hardwired-to-zero?%g0?register[5]
    Z80NOP10x00There are some other instructions without any effect (and the same timing):?LD A, A,?LD B, B?etc.
    PDP-10JFCL 0,?(conventional)
    JUMP, SETA, SETAI, CAI, TRN, TLN
    1 word25500******* (octal)Jump never
    Jump never, set nothing, skip never
    PDP-11NOP16 bits000240 (octal)Clear none of the condition codes
    VAXNOP10x01Delay is dependent on processor type
    • ?從硬件設計的角度來看,總線的未映射區域通常設計為返回零; 由于 NOP 滑動行為通常是可取的,因此它傾向于使用全零操作碼對其進行編碼。

    引用:

    超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

    總結

    以上是生活随笔為你收集整理的NOP (code)_NOP指令作用及解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。