实模式和保护模式下的段寄存器
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 最高权限