我需要修改一些 dll,但我不知道,在保护模式下段寄存器( DS
、 SS
、...)究竟做了什么。我在学校学到了真正的 16 位模式,其中段寄存器乘以 16 加上正常寄存器中的偏移量给出物理内存中的有效地址。在保护模式下,有一些平面内存模型和虚拟内存,其中每个进程“有”4GB 内存,所以如果寄存器有 32 位,那么我只能通过“偏移”寄存器来寻址虚拟内存的每个字节。例如,哪些目的在保护模式下具有段寄存器
mov eax, dword ptr ds:[20037DA0]
最佳答案
基本上目的与实模式相同,只是它们的工作方式略有不同。您的示例中的 DS 在您的 GDT 中选择一个内存描述符(如果您真的想了解这一点,请使用谷歌这个术语,“全局描述符表”),其中包含基地址、结束地址、粒度等信息。然后将您的偏移量添加到基地址, 结束。如果你在 windows 上(我打赌在 linux 上是一样的)你通常不必担心这些段寄存器,正如你所说的它的平面模型,这意味着所有内存应该只有一个描述符,所以如果你不改变这些寄存器应该像它们不存在一样工作。
关于assembly - x86 保护模式下段寄存器的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15335003/