我知道邏輯左移和算術左移執行相同的操作,即在移位 k 位時將數字乘以 2 k。在 x86-64 ISA 中,有邏輯左移shl和算術左移兩條指令sal。當兩條指令都做同樣的作業時,創建第二條指令的必要性是什么?
uj5u.com熱心網友回復:
SHL 和 SAL 在功能上是等效的,但在概念上不是。D3x86 體系結構為 format 中的 shift/rotate 指令保留的操作代碼r/m32, CL有八個位置,由位元組中的Reg/Opcode欄位區分ModR/M:
D3 /0 ROL
D3 /1 ROR
D3 /2 RCL
D3 /3 RCR
D3 /4 SHL
D3 /5 SHR
D3 /6 SAL # not officially documented
D3 /7 SAR
由于 SAL 和 SHL 的作業方式相同,因此英特爾官方檔案保留了空缺位置
,D3 /6 SAL但其編碼有效。一些匯編程式允許通過未記錄的助記符 SAL2 選擇此編碼。
SHL/SAL 并不是這種冗余的唯一情況。TEST reg, imm編碼方式F7 /0與未記錄的編碼方式相同F7 /1。
Stephen Morse,8086 的 ISA/機器碼架構師,寫了一本書,8086 Primer,目前可以在他的網站上免費閱讀;第 65、66 頁描述了移位/旋轉機器碼,但他沒有提到未使用的/6編碼,而是說 SHL 和 SAL 是相同的操作并使用D0 /4操作碼。(本書面向使用 8086 的程式員,而不是直接分析設計決策,所以這并不令人意外。)
8086 沒有 #UD 非法指令例外:所有內容都被解碼為某些內容,并且可能最容易安排/6運行相同的內容,/4以便它們都可以左移而不是使其成為 NOP。(/r設定3 位欄位的高位,所以它是一個移位,而不是旋轉,低位清除,所以它是左,不是右。在這種情況下,中間位沒有影響,因為我們正在移出高位,而不是進去。)
有關的:
- 80x86 中 SHL 和 SAL 之間的區別是的,它們是相同的。
uj5u.com熱心網友回復:
正如評論由@ecm提到,可能的原因sal和shl是對稱sar和shr。這兩條左移指令在英特爾的軟體開發人員手冊中被列為單獨的指令,但具有相同的操作碼,即從處理器的角度來看它們是相同的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/381523.html
下一篇:將字符插入到NASM中的字串中
