实模式和保护模式下的段寄存器

ES CS DS SS FS GS LDTR TR

32位下段寄存器的组成图:(不考虑64位)

分为4个部分

  • Selector   16位/可见
  • Attribute  16位/不可见
  • Limit   32位/不可见
  • Base  32位/不可见

实模式寻址

8086实模式寻址时:

mov cx,0x2000
mov ds,cx
mov [0xc0],al
;以上,将段寄存器ds的值设置为0x2000,
;然后向该段内偏移地址为0x00c0的地址写入al的值,
;写入时,将ds的值左移4位,再加上0x00c0,即:0x200c0

32位实模式寻址不一样:

mov ax,cs
mov ds,ax
;第一句 ax=cs.Selector
;第二句 先 ds.Selector=ax
;然后 ds.Base=ds.Selector<<4,Base只用到了低20位。

32位环境下,当用汇编读取某一地址时:

mov dword ptr ds:[0x123456],eax
;真正读写的地址是ds.base+0x123456

 32位保护模式下寻址

6个段寄存器ES CS DS SS FS GS叫做段选择器,和实模式不同,保护模式的内存访问有自己的方式,

在保护模式下,尽管访问内存时也需要指定一个段,但传送到段选择器的内容不是逻辑段地址,而是段选择子。

段选择子由三部分组成:

  • 描述符索引——用来在描述符表中选择一个段描述符。
  • 描述符表指示器——TI=0时,在GDT表中;TI=1时,在LDT表中。
  • 请求特权级别——4个级别,0,1,2,3。

例:

mov cx,00000000000_10_000B         ;加载数据段选择子(0x10)
mov ds,cx
;索引号  00000000000_10   2
;TI  0  GDT
;权限 00 最高权限
原文地址:https://www.cnblogs.com/a-s-m/p/12759195.html