GdtLen EQU $ - LABEL_GDT
GdtPtr DW GdtLen-1
DD 0
XOR EAX,EAX
MOV AX,DS
SHL EAX,4
ADD EAX,LABEL_GDT
MOV DWORD[GdtPtr+2],EAX
LGDT [GdtPtr]
上面基本上就是把GDT的物理地址填充到GDTPTR中,再load到gdtr中。那上面的SHL EAX,4是怎么回事啊?这么一句放在这里,怎么想也想不明白。期待高人指点!
------解决方案--------------------------------------------------------
SHL EAX,4有错误,
要么SHL EAX,1
要么 MOV CL,4
SHL EAX,CL
还有应该是MOV DWORD PTR[GdtPtr+2],EAX 把
XOR EAX,EAX, " SHL EAX,4 " 是先把EAX的内容取反,EAX 的低4位送高4位(或者将EAX剩16)
------解决方案--------------------------------------------------------
为楼主解惑,为国家的操作系统事业贡献力量^_^!
GdtLen EQU $ - LABEL_GDT ;GDTR(全局描述符表寄存器)使用的数据结构
GdtPtr DW GdtLen-1
DD 0 ;待填
XOR EAX,EAX ;清零EAX
MOV AX,DS ;加载数据段的段值到AX
SHL EAX,4 ;通过将AX左移四位,用EAX表示数据段的物理内存首地址
ADD EAX,LABEL_GDT ;获取LABEL_GDT(全局描述符表)的物理内存地址
MOV DWORD[GdtPtr+2],EAX ;填充全局描述符表指针的地址域
LGDT [GdtPtr] ;加载全局描述符表到GDTR(全局描述符表寄存器)
补充:joydiy() 所言谬也!
------解决方案--------------------------------------------------------
从80286开始,支持SHL的移动位数可以由立即数直接指定了