2

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

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

我的理解正确吗?

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

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

4

3 回答 3

3

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

例如:

mov ds, 0x0000

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

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

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

编辑:链接

于 2010-07-26T18:54:48.463 回答
0

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

sukru 的回答是我记得的。

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

于 2010-07-26T18:59:35.317 回答
0

请注意,SS DS ES 等选择器在用户级是无意义的,因为它们指向相同的(通常为 4 字节)页面。我不知道它是如何关于内核编程的......

于 2010-07-26T21:25:32.557 回答