一、段寄存器有哪些?
通常我们用汇编读写某一个地址时,如下
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,那么填充到段寄存器中为0X123FFF;P位为1时段描述符中的Limit值为0XFFFFF,那么填充到段寄存器中为0XFFFFFFFF!)
段描述符示意图如下