真實模式
當英特爾設計原始的 x86,8086(和 8088 衍生產品)時,它們包括分段,允許 16 位處理器訪問超過 16 位的地址。他們通過使 16 位地址相對於給定的 16 位段暫存器來實現這一點,其中定義了四個:程式碼段(CS
),資料段(DS
),額外段(ES
)和堆疊段(SS
)。
大多數指令暗示使用哪個段暫存器:指令是從程式碼段中刪除的,PUSH
和 POP
暗示了堆疊段,而簡單資料引用暗示了資料段 - 儘管這可以被覆蓋以訪問任何其他段中的儲存器。
實現很簡單:對於每次記憶體訪問,CPU 將採用隱式(或顯式)段暫存器,將其向左移動四個位置,然後新增指示的地址:
+-------------------+---------+
Segment | 16-bit value | 0 0 0 0 |
+-------------------+---------+
PLUS
+---------+-------------------+
Address | 0 0 0 0 | 16-bit value |
+---------+-------------------+
EQUALS
+-----------------------------+
Result | 20-bit memory address |
+-----------------------------+
這允許各種技術:
- 允許程式碼,資料和堆疊都可以互相訪問(
CS
,DS
和SS
都具有相同的值); - 保持程式碼,資料和堆疊彼此完全分離(
CS
,DS
和SS
所有 4K(或更多)彼此分開 - 記住它乘以 16,所以這是 64K)。
它還允許奇怪的重疊和各種奇怪的事情!
當 80286 被髮明時,它支援這種傳統模式(現在稱為真實模式),但增加了一種稱為保護模式(qv)的新模式。
需要注意的重要事項是在真實模式下:
- 只需將正確的值放入段暫存器並訪問 16 位地址即可訪問任何儲存器地址。
- 保護的程度是允許程式設計師將不同的記憶體區域分開以用於不同的目的,並且使得更難以意外地寫入錯誤的資料 - 同時仍然可以這樣做。
換句話說……根本不受保護!