
段寄存器是根据内存分段的管理模式而设置的,可用于动态重定位。内存单元的物理地址由段寄存器的值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
CPU内部的段寄存器:
CS——代码段寄存器(CodeSegmentRegister),其值为代码段的段值;
DS——数据段寄存器(DataSegmentRegister),其值为数据段的段值;
ES——附加段寄存器(ExtraSegmentRegister),其值为附加数据段的段值;
SS——堆栈段寄存器(StackSegmentRegister),其值为堆栈段的段值;
FS——附加段寄存器(ExtraSegmentRegister),其值为附加数据段的段值;
GS——附加段寄存器(ExtraSegmentRegister),其值为附加数据段的段值。
段寄存器作目的 *** 作数时,源 *** 作数不能是立即数;CS不能作为目的 *** 作数
在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。
32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的。有关规定简单描述如下:实方式:前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为“段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。保护方式:在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”(Selector)的某个值。[如:在linux-0.11中,CS存储的是段描述符。段描述符的0、1位(右数,从0开始)表示特权等级,2位表示是选择全局描述符表(GDT)还是局部描述符表(LDT),3位至更高有效位表示选择GDT(或是LDT)表中的第(n+1)项(表项从0开始)。]
*************************以上是个人见解,若有错,请指正:-)*******************************
FS、GS 是从 80386 开始增加的,没有全称,取名就是按字母序排在 CS、DS、ES 之后的。而 CS、DS、ES、SS 是有全称的:
CS (Code Segment) 代码段
DS (Data Segment) 数据段
ES (Extra Segment) 附加段
SS (Stack Segment) 栈段
不是很明白你的意思。寄存器是个硬件的结构,存在CPU中,比如EAX,EBX,ECX,EDX这些通用寄存器。硬件设备也会有寄存器,用来给软件提供控制的方法。比如显卡肯定有个寄存器来启用或者禁用。读写寄存器标准的使用IN,OUT指令(IA架构)。当然也会有把寄存器映射到内存空间,想读写内存一样读写寄存器。用户态程序一般是无法访问寄存器的,除非驱动程序把寄存器映射到用户进程空间欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)