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. 彙編8086程序
- 4. 我應該在哪裏加載程序到RAM中?
- 5. 將偏好的應用程序加載到Windows上的RAM上
- 6. Intel 8086彙編程序從C調用
- 7. 加載在RAM中的C#類代碼?
- 8. 在程序集編程8086中添加十進制數字
- 9. 從內存中將正確的值加載到8086程序集的寄存器中
- 10. 將程序加載到RAM並執行它們NASM 16b
- 11. Opencv Circle檢測 - RAM加載
- 12. UnsatisfiedLinkError:無法從加載程序加載
- 13. 8086程序中使用循環
- 14. 在程序集中生成聲音8086
- 15. 從RAM運行Java應用程序
- 16. 將部分矩陣加載到RAM中
- 17. 從磁盤加載程序
- 18. 程序集8086在字符串中添加空格
- 19. 檢查WIX安裝程序中的RAM
- 20. MEF程序集從緩存中加載?
- 21. 在ASP.NET中從Bin加載程序集
- 22. MVC - 從程序中加載DLL
- 23. 從程序中加載數據
- 24. 從網絡中加載程序集
- 25. 從內存中加載程序集
- 26. 程序集8086光標的放置
- 27. 如何使用ARM程序集將多個數組值加載到RAM中?
- 28. 如何從RAM內存中存儲和加載類?
- 29. 無法從GAC加載程序集,但它從程序文件夾加載
- 30. 如何從Java程序中檢索可用RAM的數量?
RAM實際上是24位。這就是爲什麼它的段落與段寄存器加偏移量對齊。當你指定一個8位地址時,它假定段寄存器是基址。 –