段寄存器

一、段寄存器有哪些?

    通常我们用汇编读写某一个地址时,如下

    mov  dword ptr ds:[0x123846],eax

    这时我们把eax的值往地址去写,写的地址是:

    ds.base+0x123846

 

    段寄存器有ES、CS、SS、DS、FS、GS、LDTR、TR共8个。

 

二、段寄存器的结构

    图形表示:


     结构体表示:

 

struct SegMent
{
	WORD Selector;	//16位Selecter	选择子
	WORD Atrributes;//16位Atrribute	属性
	DWORD Base;	//32位Base
	DWORD Limit;	//32位Limit
};


    总结:总共有96位,其中16位段选择器可见,其余80位不可见

 

 

三、段寄存器的读写

    ----读段寄存器

         比如  mov ax,es//只能读16位的可见部分

    ----写段寄存器

         比如  mov ds,ax//写时是写96位的

    引出问题,那么ax是16位的,送到ds中,那么ds中其余80位填写什么呢?

    答:段描述符

           当执行mov ds,ax时,CPU都会查表,根据ax的值查找GDT还是LDT!

   具体见GDTR与LDTR

   找到段描述符后,根据段描述符64位去填充寄存器中不可见部分的80位。(注意G位,因段描述符中的Limit位数为20位即FFFFF,而段寄存器中的Limit属性位数为32位!当G位为0时,则单位为字节,最大值为FFFFF,填充0X000FFFFF;当G位为1时,则单位为4KB,4KB即FFF(填充段寄存器中低12位),段描述符中的Limit位数填充高20。例如P位为1时段描述符中的Limit值为0X123,那么填充到段寄存器中为0X123FFFP位为1时段描述符中的Limit值为0XFFFFF,那么填充到段寄存器中为0XFFFFFFFF!)

 

段描述符示意图如下


 

posted @ 2017-05-31 00:09  jadeshu  阅读(1404)  评论(0编辑  收藏  举报