当前位置: 代码迷 >> 汇编语言 >> 有点代码看不懂,帮忙解释一下解决办法
  详细解决方案

有点代码看不懂,帮忙解释一下解决办法

热度:6328   发布时间:2013-02-26 00:00:00.0
有点代码看不懂,帮忙解释一下
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的移动位数可以由立即数直接指定了
  相关解决方案