0.12 cs、ds这类sreg段寄存器,位宽是多少
CPU中存在段寄存器是因为其内存是分段访问的,这是设计之初决定的,属于基因里的东西。前面已经介绍过了内存分段访问的方法,这里不再赘述。
CPU内部的段寄存器(Segment reg)如下。
(1)CS——代码段寄存器(Code Segment Register),其值为代码段的段基值。
(2)DS——数据段寄存器(Data Segment Register),其值为数据段的段基值。
(3)ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段基值,称为“附加”是因为此段寄存器用途不像其他sreg那样固定,可以额外做他用。
(4)FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段基值,同上,用途不固定,使用上灵活机动。
(5)GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段基值。
(6)SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值。
32位CPU有两种不同的工作模式:实模式和保护模式。
每种模式下,段寄存器中值的意义是不同的,但不管其为何值,在段寄存器中所表达的都是指向的段在哪里。在实模式下,CS、DS、ES、SS中的值为段基址,是具体的物理地址,内存单元的逻辑地址仍为“段基值:段内偏移量”的形式。在保护模式下,装入段寄存器的不再是段地址,而是“段选择子”(Selector),当然,选择子也是数值,其依然为16位宽度。
可见,在32位CPU中,sreg无论是工作在16位的实模式,还是32位的保护模式,用的段寄存器都是同一组,并且在32位下的段选择子是16位宽度,排除了段寄存器在32位环境下是32位宽的可能,综上所述,sreg都是16位宽。