2011-08-19 63 views

回答

4

這實際上只是一個註冊分隔符,而不是操作符。這意味着使用DX寄存器作爲與DS段寄存器基址的偏移量。

它究竟是什麼給出你作爲一個地址取決於你在什麼模式下運行(真實或受保護)。

例如,在實模式下,段寄存器乘以16並添加到偏移量寄存器,爲您提供20位物理地址。如果DS0x1234DX0x5678

12340 
+ 05678 
    ----- 
    179B8 

在保護模式下,DS是實際上可以分段選擇其被用於查找的基地址用於在表存儲器中,然後添加到偏移寄存器給一個價值。

該值始終是一個虛擬地址,它在確保從外部存儲器中對相關虛擬內存進行分頁之後,由內存管理單元(MMU)映射到物理地址。

+0

謝謝(哇,那很快:D) – TheBreadCat

2

:操作者區分從一個通用寄存器段寄存器/選擇器,並表示該段中訪問該寄存器的值。因此,例如,

DS:DX 

指16位實模式來訪問DX寄存器偏移量爲DS段值的16位值,該值以16字節值遞增(即段值0x0000和0x0001之間的差值表示16字節偏移量)。舉例來說,如果DS中的值爲0xA000,並且DX中的值爲0xFF,則您將尋址0xA00FF處的值。

在32位保護模式下,段選擇器表示一個16位描述符值,其中位3-15用作CPU全局描述符表或局部描述符表中的查找偏移量,其中包含32位段地址範圍以及該段的環級訪問權限(即內核級別,用戶級別等)。位0-1表示請求專用級別,它阻止用戶級別的進程加載更高權限的分段值。位2是一個標誌,當清除意味着在GDT中查找段時,或者如果設置意味着偏移到LDT中。例如,DS的值爲0x0010意味着在請求權限級別爲0的情況下查找GDT中的第三個插槽(即,您需要處於內核級別模式才能設置此值)。然後,DX中的值將從GDT中爲該特定段設置的地址範圍的開始處開始偏移。

相關問題