簡體   English   中英

為什么我不能在 8086 中同時使用 SI 和 DI 或 BX 和 BP 寄存器進行間接尋址?

[英]Why can't I use both SI and DI or BX and BP registers with indirect addresing in 8086?

我知道它們是唯一可以用於間接尋址的寄存器,但我找不到解釋為什么我不能同時使用這些對的原因。

為什么機器不支持像[si+di]這樣的尋址模式?

看一下編碼

大多數 8086 指令采用兩個操作數,一個必須是寄存器,另一個可以是寄存器或 memory 操作數 (r/m)。 8086 使用稱為 ModRM 字節的一個字節來指定操作數。 其中的 3 位是reg字段,它指定 8 個通用寄存器中的哪一個構成寄存器操作數。 2 位是mod字段,其中 select 無論 r/m 操作數是寄存器,還是 memory 操作數,沒有位移,8 位位移或 16 位位移。 其余三位是r/m字段。 所以你已經看到只有 8 種寄存器組合是可能的。

r/m 字段的高位選擇是使用一個寄存器還是兩個寄存器尋址模式。 因此,如果選擇雙寄存器,我們還剩下兩位到 select 這兩個寄存器,因此只有四種組合是可能的。 它們的編碼方式是使兩個位 select 中的較高位為 BX 或 BP,而較低位 select 為 SI 或 DI。 這導致了你所知道的四種組合。 低位不能同時為0和1,所以不能同時有SI和DI。

不要忘記 8086 及其指令編碼是在 70 年代后期設計的。 如果設計者想要提供更大的靈活性,他們將不得不使用一種更復雜的編碼方案,一個字節都放不下。 這意味着代碼會更大( memory 在 1978 年每兆字節的成本約為 20,000 美元)並且 CPU 將需要更多的晶體管(8086 只有 29,000個),從而增加了整體成本。

1985年32位的80386發布時,確實有更靈活的尋址方式; 添加了另一個字節(SIB 字節),它允許在有效地址中使用一個或兩個通用寄存器的任意組合,並對其中一個應用可選的移位。 然而,386 的晶體管數量是 8086 的十倍,而 memory 的價格在其間的 7 年中下降了約 50 倍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM