“nop; jmp 短”與“jmp 短; nop”

“nop; jmp 短”與“jmp 短; nop”

好吧,首先讓我說清楚:這與微優化無關。

但是,我知道在分割區上的引導程式中,很多使用編碼jmp short; nop。但據我了解,jmp「跳轉」的次數越少:)處理器完成所需的週期就越少,並且某些處理器會看到它0x90並跳過它而不對其進行評估。

答案1

您可能想看看Intel 64 與 IA-32 架構軟體開發人員手冊,它們是從程式設計師的角度理解 x86 架構的重要資源(假設您已經熟悉彙編)。

[...]我的理解是,jmp「跳躍」的次數越少:)處理器完成所需的週期就越少

您需要區分近跳和遠跳。近跳轉只需增加(或透過 2 的補碼數學運算減去)指令指標 (IP) 的偏移量,或從目前代碼段 (CS) 重新載入 IP 偏移量。近跳轉通常可以將偏移量儲存在指令字本身或暫存器中 - 因此可以在一個週期內取得整個跳轉指令。

遠跳轉將指令指標的實際新位址儲存在下一個字或記憶體位置,因此這需要額外的提取 - 因此需要更長的時間。在 x86 和 x86-64 上,您可以不是遠跳到暫存器中儲存的位置(它必須是下一個指令字或記憶體中的某個位置)。

有些處理器看到 0x90 後就跳過它而不對其進行評估。

NOP是的,這就是指令應該做什麼的定義。 CPU 仍然需要取得0x90操作碼,但計算本質上不執行任何操作。

相關內容