2011-03-03 76 views
3

爲什麼IA-32使我們能夠跳入指令的中間?跳轉到IA-32的指令中間

當我在彙編程序中編寫時,如何使用此架構特性進行優化? (除了明顯的情況,我們喜歡在寄存器內保存命令的編碼,然後激活這個命令)?

回答

3

由於歷史原因,IA-32允許跳轉到指令的中間。 x86指令集是8080(第一個「x86」的前身)所使用的指令集上的連續層的結果,它使我們回到70年代後期。當時,RAM非常昂貴,並且儘可能縮短指令是值得的,即使這意味着所有指令的長度都不相同。現在,IA-32指令長度可以在1個字節到12個字節之間。這意味着任何地址都可能是指令的開始(無對齊要求),但許多地址指向指令中間的某個字節。跳轉到指令中間會指示CPU重新解釋以跳轉目標字節開始的機器碼字節,從而產生完全不同的指令。

對於優化,正確使用「跳到中間」功能的方法是而不是使用它。 CPU通過將指令流內部轉換爲一系列具有更加規則結構的微指令來解碼指令流,並在其上面加速工作(並行執行,推測分支跟隨等)。中間跳躍可能會破壞這些優化。

+0

x86指令是1到15個字節,而不是12個 – 2014-02-02 07:32:55

+1

嗯,我寫了「超過12」,我認爲15的確是「超過12」。由於每個新的體系結構版本都引入了新的操作碼,因此指令的最大長度並不受限制。即使今天的x86上升到15字節,內部版本也可能超越。 – 2014-02-02 12:17:34

3

這將是更正確地說,它不會強迫你只能跳到指令的開端......

處理器不知道裏的指示開始。它只是看到一大堆字節。你可以跳轉到你想要的任何字節。它會嘗試從那一刻開始解碼。

跳入指令的中間似乎是一個糟糕的主意。我能看到的唯一的非錯誤使用是跳轉到避免前綴的指令(如LOCK)。不知道如何這將是任何實際使用。

+4

可能最常見的原因是混淆 - 使人們難以反彙編代碼。 – Brendan 2011-03-04 05:32:44