X86 指令地址为什么没有对齐?是为了节省空间,还是有其他原因?
离线
因为x86指令集在设计的时候就没有固定长度吧,印象中是这样。微架构上还需要一个译码环节,将CISC风格的机器码转换成规整的RISC风格指令执行,此时的指令应该就是定长并且对齐,方便处理器前端的取指了
离线
因为x86指令集在设计的时候就没有固定长度吧,印象中是这样。微架构上还需要一个译码环节,将CISC风格的机器码转换成规整的RISC风格指令执行,此时的指令应该就是定长并且对齐,方便处理器前端的取指了
那就是说 x86 带着历史包袱?
理论上如果对齐的话,效率应该更高吧?
离线
http://www.formosaos.url.tw/my8051/8051_execute.html
五、指令抓取範例
8051的指令屬於複雜指令集架構(cisc),指令的長度不一定一樣。當8051抓取的指令的第一個機械碼的時候,就要解出後面還有幾個參數要抓取,並進行抓取的動作。每次指令抓取(fetch)的時間應該是2 clock,我以nop、ajmp、ljmp這3個指令來解釋8051指令的抓取與執行。
指令nop是一個1 byte的無動作指令,8051必須先到 ROM中抓取指令,這個指令抓取需要2 clocks。之後,在8051裡面花10 clocks 執行該指令。這樣的過程總共需要12clocks。
指令ajmp是一個2 bytes的跳躍指令,8051必須到先到ROM中抓取指令。因為匯流排是8位元,所以必須抓兩次,需要4 clocks。之後,在8051裡面再花20 clocks執行該指令。共需要24clocks。
指令ljmp是一個3bytes的跳躍指令,8051必須到先到ROM中抓取指令。因為匯流排是8位元,所以必須抓三次,需要6 clocks。之後,在8051裡面再花20clocks執行該指令。共需要24clocks。
如果我們想要到一個ajmp可以到達的地方卻用ljmp去寫的話,雖然結果都一樣,但是ljmp會花費更多的程式碼去執行這樣的指令。
离线
alexyzhov 说:因为x86指令集在设计的时候就没有固定长度吧,印象中是这样。微架构上还需要一个译码环节,将CISC风格的机器码转换成规整的RISC风格指令执行,此时的指令应该就是定长并且对齐,方便处理器前端的取指了
那就是说 x86 带着历史包袱?
理论上如果对齐的话,效率应该更高吧?
现代CPU是整段整段的读进CPU的,不是一条一条的读的,所以对不对齐效率都一样高。指令译码时已经指令是对齐的了。
离线
现代存储技术,指令的对齐与否不重要。
相对于主板,硬盘是块设备,相对于CPU,DDRx是块设备(CPU是整块整块的从DDR里读进的)。CPU内部,还有一个翻译器,把X86指令变成对齐的指令,其实最简单的办法就是直接填充0就可以,也可以用几条指令替换。到这里,才是真正的原始的计算机了,直接对指定地址内的指令操作(显然这小块“内存”是个滑动的窗口)。
最近编辑记录 凿子树 (2020-01-11 14:45:59)
离线
@凿子树 相当专业!
离线