8086使用16位指令,但RAM地址只保存8位CPU如何從RAM加載程序?它是否加載一個地址,然後檢查指令是否需要1/2/3個字節(例如,將一個立即移動到一個8/16位寄存器),然後執行操作,或者我錯誤地認爲一個RAM'空間'是16位大?從8086的RAM中加載程序
回答
許多指令是多字節的,是的,這意味着它們跨越兩個或更多的地址。
IIRC,8086的存儲器總線是16位,所以它可以在一次操作中加載16位(兩個相鄰的地址)。您將字節可尋址內存與總線寬度相混淆。
它加載一個地址,然後如果所述指令需要1/2/3字節檢查(例如移動即時到寄存器8/16位)
它不斷地取指令字節到6字節緩衝區(一次2個字節,因爲它是一個16位CPU,帶有16位總線)。該緩衝區足夠大以容納最大允許的8086指令(不包括可能被單獨解碼的前綴IDK)。當它完成前面的指令時,它會查看緩衝區。請參閱下面的鏈接以獲得更好的描述,但它可能會嘗試將緩衝區解碼爲整個指令。如果它在找到指令結束之前碰到提取緩衝區的末尾,它會等到下一個提取循環完成並再次嘗試。
另請參閱:8086 CPU architecture,這是「8086代碼獲取」的第一個命中。它確認提取和執行確實重疊,所以它以最基本的方式流水線化。
TL:DR:它獲取到一個緩衝區,直到它有一個完整的指令解碼。然後它將任何額外的字節移到緩衝區的前面,因爲它們是下一條指令的一部分。
我讀過,通常指令取指是8086的瓶頸,因此對代碼大小的優化幾乎勝過其他任何東西。
流水線CPU不需要等待執行前面的指令就可以開始解碼。現代CPU也有更高帶寬的代碼獲取,因此他們有一個解碼指令隊列準備就緒(除了當分支搞砸了。)請參閱http://agner.org/optimize/以及x86標記wiki中的其他鏈接。
此外,一些非常常見的指令是單字節,如push r16
。
我想我們可以進入我最愛的解碼雜草[** The Assembly of Sect 3.3.7 **](https://courses.engr.illinois.edu/ece390/books/artofasm/CH03 /CH03-3.html#HEADING3-102)。這是解碼的概述。 –
非常感謝您的快速回復。 –
8086上的預取隊列只有6個字節,而指令長度沒有限制。您可以使用盡可能多的冗餘前綴,15個字節的限制與'386一起添加。沒有冗餘前綴,指令可能會超過6個字節。例如'mov [es:0],1234'長度爲7個字節。但是,根本沒有前綴,我不認爲8086指令可以超過6個字節。我的猜測是前綴字節被單獨解碼,並且單獨地像他們自己的指令一樣。 –
- 1. 中斷服務程序8086
- 2. 彙編8086程序
- 3. 將偏好的應用程序加載到Windows上的RAM上
- 4. 加載在RAM中的C#類代碼?
- 5. 將程序加載到RAM並執行它們NASM 16b
- 6. Opencv Circle檢測 - RAM加載
- 7. 將部分矩陣加載到RAM中
- 8. 從磁盤加載程序
- 9. 從內存中加載程序集
- 10. MVC - 從程序中加載DLL
- 11. 從程序中加載數據
- 12. 在ASP.NET中從Bin加載程序集
- 13. 從網絡中加載程序集
- 14. 檢查WIX安裝程序中的RAM
- 15. 如何使用ARM程序集將多個數組值加載到RAM中?
- 16. 如何從RAM內存中存儲和加載類?
- 17. 程序集8086光標的放置
- 18. 如何從Java程序中檢索可用RAM的數量?
- 19. 加載程序未加載
- 20. 加載程序
- 21. 程序集8086:計數器問題
- 22. 裝配8086程序 - 裝配錯誤
- 23. DOS函數1程序集(8086)問題
- 24. 程序集8086:追加在文件末尾
- 25. 從C#應用程序中的多個線程加載DLL
- 26. 8086彙編程序 - 從操作碼生成目標代碼
- 27. 程序集8086 - 如何從箭頭鍵獲取輸入
- 28. 從另一個加載程序啓動加載程序。對還是錯?
- 29. 隨着mysqld.exe和我的應用程序RAM大小增加
- 30. 能夠從應用程序包中加載文件,但不能從測試應用程序包加載文件
RAM實際上是24位。這就是爲什麼它的段落與段寄存器加偏移量對齊。當你指定一個8位地址時,它假定段寄存器是基址。 –