3
A
回答
3
由於歷史原因,IA-32允許跳轉到指令的中間。 x86指令集是8080(第一個「x86」的前身)所使用的指令集上的連續層的結果,它使我們回到70年代後期。當時,RAM非常昂貴,並且儘可能縮短指令是值得的,即使這意味着所有指令的長度都不相同。現在,IA-32指令長度可以在1個字節到12個字節之間。這意味着任何地址都可能是指令的開始(無對齊要求),但許多地址指向指令中間的某個字節。跳轉到指令中間會指示CPU重新解釋以跳轉目標字節開始的機器碼字節,從而產生完全不同的指令。
對於優化,正確使用「跳到中間」功能的方法是而不是使用它。 CPU通過將指令流內部轉換爲一系列具有更加規則結構的微指令來解碼指令流,並在其上面加速工作(並行執行,推測分支跟隨等)。中間跳躍可能會破壞這些優化。
3
這將是更正確地說,它不會強迫你只能跳到指令的開端......
處理器不知道裏的指示開始。它只是看到一大堆字節。你可以跳轉到你想要的任何字節。它會嘗試從那一刻開始解碼。
跳入指令的中間似乎是一個糟糕的主意。我能看到的唯一的非錯誤使用是跳轉到避免前綴的指令(如LOCK)。不知道如何這將是任何實際使用。
+4
可能最常見的原因是混淆 - 使人們難以反彙編代碼。 – Brendan 2011-03-04 05:32:44
相關問題
- 1. MIPS跳轉指令範圍
- 2. 關於產品lea指令,IA32
- 3. 如何將IA32'cmp'指令轉換爲Y86?
- 4. 跳轉指令(有意義)的成本?
- 5. jmp指令可以跳轉到代碼的任何部分嗎?
- 6. 跳轉到隨機位置的DIV指令?
- 7. 跳轉到下一個使用gdb的「指令」
- 8. 跳轉到nano命令的行尾
- 9. Wordpress跳過指定的模板{{後類型},跳轉到index.php
- 10. AngularJS到角指令轉換
- 11. 在指定時間之後,跳轉到for循環中的下一個索引
- 12. 在ARM程序集中跳過指令
- 13. 跳轉到行中的Java
- 14. 彙編程序和跳轉指令(它是如何工作的)
- 15. MIPS計算跳轉指令的機器編碼
- 16. 由NoOperation指令進行跳轉的原因是什麼?
- 17. 頁跳到頁的中間
- 18. 在視頻中跳轉到陣列中的時間
- 19. AVR程序必須始終以相對跳轉指令開始?
- 20. x86彙編寄存器和mov指令,並跳轉抵消
- 21. MASM大會跳轉指令打印問題
- 22. 從哪裏獲得x86的所有版本,即IA32指令集架構手冊
- 23. 將ARM指令轉換爲i386指令
- 24. 時間軸停止()和跳轉到(「結束」)之間的區別
- 25. 如何在UIViewControllers間跳轉?
- 26. .show()之間跳轉問題
- 27. Taborder在幀之間跳轉
- 28. 指令中的指令
- 29. css轉換跳轉到中心
- 30. C#到Java跳轉
x86指令是1到15個字節,而不是12個 – 2014-02-02 07:32:55
嗯,我寫了「超過12」,我認爲15的確是「超過12」。由於每個新的體系結構版本都引入了新的操作碼,因此指令的最大長度並不受限制。即使今天的x86上升到15字節,內部版本也可能超越。 – 2014-02-02 12:17:34