段寄存器介绍
段寄存器的读写
mov ax, es ;只能读16位可见部分,Selecter
读写 LDTR 指令 SLDT/LLDT
读写TR 指令 STR/LTR //TSS
当执行指令 mov 段寄存器,Reg16 时, CPU会去查GDT表.
mov ds, ax ;写的时候写96位
mov dword ptr ds:[0x12345678], eax
我们真正写的地址是ds.base + 0x12345678
DS/CS/SS/ES/FS/GS/LDTR/TR
段寄存器的结构,共96位
16位 Selecter(可见) + 32位Base + 32位 Limit + 16 位 Attribute
struct Segment
{
WORD Selector;
WORD Attributes;//可读可写可执行
DWORD Base;
DWORD Limit;
}
段名 |
段选择子 |
属性 |
Base |
Limit |
ES |
0023 |
可读可写 |
0 |
0xFFFFFFFF |
CS |
001B |
可读可执行 |
0 |
0xFFFFFFFF |
SS |
0023 |
可读可写 |
0 |
0xFFFFFFFF |
DS |
0023 |
可读可写 |
0 |
0xFFFFFFFF |
FS |
003B |
可读可写 |
0x7FFDE00 |
0xFFF |
GS |
|
|
|
|
几个证明段寄存器结构的例子:
CS段不可写的实例:
mov ax,ss
mov ds,ax
mov dword ptr ds:[var], eax
base 属性证明:
mov ax,fs
mov gs,ax
mov dword ptr ds:[var] , eax
Limit 属性证明:
mov ax,fs
mov gs,ax
mov eax,gs:[0x1000] //超过了fs的Limit
mov eax,dword ptr ds:[0x7FFDE00 + 0x1000]
mov dword ptr ds:[var], eax
|