【2021.02.26】段寄存器结构

什么是段寄存器?

当使用汇编读写某一个地址时:mov dword ptr ds:[0x123456], eax。

真正读写的地址是:ds.base + 0x123456。

ds:段寄存器。

base:ds段寄存器中的某一个成员。

有哪些段寄存器?

ES、CS、SS、DS、FS、GS、LDTR、TR

段寄存器的结构

  1. 对通用寄存器可能都有一定的了解,比如EAX寄存器可以分为8位、16位和32位的。EAX最大就是32位。
  2. 但是段寄存器不是这样的,段寄存器相对来说要复杂,它有96位。
  3. 段寄存器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位。

思考

  1. 段寄存器只能看见16位,如何证明有96位?
  2. 写段寄存器时,只给了16位,剩下的80位填什么?

猜你喜欢

转载自blog.csdn.net/qq_18120361/article/details/114152731