2011-08-19 42 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中为该特定段设置的地址范围的开始处开始偏移。

相关问题