Segment-register
📄 返回目录页
段寄存器,给内存地址划分段,便于寻址,毕竟只需要将段地址和偏移地址相加就可以得到物理地址。
在8086中段寄存器都是16位,而总线有20根,所以8086中的物理地址都是20位的。因此段地址要左移4位,也就是乘于16或者是0x10后与偏移地址相加。
因为段寄存器是16位的,所以每个段都最少可以有16个偏移地址,最多有65536个
-
cs: 代码段
-
ds: 数据段
-
ss: 栈段
-
es: 扩展段 (可以代替数据段工作)
-
fs: 数据段
-
gs: 数据段
当CPU工作于保护模式下,段寄存器存储的内容不再是段基址了,此时的段寄存器中存放的是段选择子(Segment Selector),用来指示当前这个段寄存器“指向”的是哪个分段。
段选择子的结构:

-
PRL: 特权请求级,ring0-ring3四个特权级。
-
TI: 0表示用的是全局描述符表GDT,1表示使用的是局部描述符表LDT。
-
Index: 这是一个表格中表项的索引值,这个表格叫内存描述符表,它的每一个表项都描述了一个内存分段。
保护模式下的段寄存器和段描述符到最后的内存分段,通过下图的方式联系在一起: