据我所知,回到16位PC的时代,我们有Segment寄存器包含每种类型段的地址,你可以使用类似SS的东西访问偏移:[EDI],这将取得包含的值在EDI中作为堆栈段的偏移量。
现在我知道在32位系统中,我们有GDT(全局描述符表)和LDT(局部描述符表),现在段包含该表的索引,并且可以计算出指向右侧的偏移量记忆地址。
我的理解是否正确?
PUSH DWORD PTR SS:[EBP + 8]; basicbof.00401000
那么这样的声明在32位操作系统(XP SP2)上意味着什么?
答案 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)的页面。我不知道内核编程是怎么回事......