汇编程序:如何在32位系统中使用分段?

时间:2010-07-26 18:43:23

标签: memory assembly x86 memory-segmentation

据我所知,回到16位PC的时代,我们有Segment寄存器包含每种类型段的地址,你可以使用类似SS的东西访问偏移:[EDI],这将取得包含的值在EDI中作为堆栈段的偏移量。

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

我的理解是否正确?

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

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

3 个答案:

答案 0 :(得分:3)

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

例如:

mov ds, 0x0000

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

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

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

修改:link

答案 1 :(得分:0)

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

sukru回答是我记得的。

我会将你的汇编语句解释为:在StackSegment上获取DWORD:BasePointer + 8(=一个局部变量或方法参数 - 不记得了)并将它放在堆栈上

答案 2 :(得分:0)

请注意,SS DS ES等选择器处于用户无意义的状态,因为它们指向相同(通常为4 KB)的页面。我不知道内核编程是怎么回事......