段寄存器

一、段寄存器有哪些?

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

    mov  dword ptr ds:[0x123846],eax

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

    ds.base+0x123846


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


二、段寄存器的结构

    图形表示:

段寄存器_第1张图片

     结构体表示:

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!)


段描述符示意图如下

段寄存器_第2张图片

你可能感兴趣的:(汇编)