【问题标题】:Assembler: How are segments used in 32bit systems?汇编程序:在 32 位系统中如何使用段?
【发布时间】:2011-03-21 06:09:09
【问题描述】:

据我所知,在 16 位 PC 的时代,我们的段寄存器包含每种类型段的地址,您可以使用类似 SS:[EDI] 的方式访问偏移量,这将采用包含的值在 EDI 中作为堆栈段的偏移量。

现在我知道在 32 位系统中,我们有 GDT(全局描述符表)和 LDT(本地描述符表),段现在包含该表的索引,并且可以计算指向右侧的偏移量内存地址。

我的理解正确吗?

PUSH DWORD PTR SS:[EBP+8] ; basicbof.00401000

那么这样的声明在 32 位操作系统 (XP SP2) 上意味着什么?

【问题讨论】:

    标签: memory assembly x86 memory-segmentation


    【解决方案1】:

    请注意,SS DS ES 等选择器在用户空间中是无意义的,因为它们指向相同的(通常为 4 字节)页面。我不知道内核编程是怎么回事……

    【讨论】:

      【解决方案2】:

      phu - 10 年后我的知识有点生疏了。

      sukru 的回答是我记得的。

      我会将您的汇编语句解释为:在 StackSegment:BasePointer+8 处取 DWORD(=局部变量或方法参数 - 不记得)并将其放入堆栈

      【讨论】:

        【解决方案3】:

        段寄存器现在包含选择器。每个选择器都是全局或本地描述符表中的索引,加上请求的安全级别。

        例如:

        mov ds, 0x0000
        

        将从表 0 (GDT) 中放入选择器 0,对 DS 具有 0 级访问权限。 (这是一个特殊的寄存器,用于空指针测试)。

        这些表包含每个选择器的基本 + 长度信息,因此不再限于 64K(但可能是 0 到 4GB 之间的任何值)。

        了解这些内容的最佳方式是阅读(免费提供的)英特尔处理器文档。

        编辑:link

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-19
          • 1970-01-01
          • 2023-03-20
          • 1970-01-01
          • 2020-02-17
          • 2014-01-28
          相关资源
          最近更新 更多