什么是段寄存器?
当使用汇编读写某一个地址时:mov dword ptr ds:[0x123456], eax。
真正读写的地址是:ds.base + 0x123456。
ds:段寄存器。
base:ds段寄存器中的某一个成员。
有哪些段寄存器?
ES、CS、SS、DS、FS、GS、LDTR、TR
段寄存器的结构
- 对通用寄存器可能都有一定的了解,比如EAX寄存器可以分为8位、16位和32位的。EAX最大就是32位。
- 但是段寄存器不是这样的,段寄存器相对来说要复杂,它有96位。
- 段寄存器96位中有16位是可见的,剩下80位是不可见的。
使用图形表示
使用结构体表示
struct SetMent
{
WORD Selector; // 16位Selector 可见部分
WORD Attributes; // 16位Attributes 表示当前段寄存器是可读还是可写
DWORD Base; // 32位Base 表示当前段寄存器是从哪里开始的
DWORD Limit; // 32位Limit 表示当前段寄存器整个的长度有多少
}
段寄存器的读写
读段寄存器
MOV AX, ES
注意:在读段寄存器的时候只能读16位的可见部分。
读写LDTR的指令为:SLDT/LLDT
读写TR的指令为:STR/LTR
写段寄存器
MOV DS, AX
注意:写段寄存器时是写96位。
思考
- 段寄存器只能看见16位,如何证明有96位?
- 写段寄存器时,只给了16位,剩下的80位填什么?