Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 汇编程序:32位系统中如何使用段?_Memory_Assembly_X86_Memory Segmentation - Fatal编程技术网

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

Memory 汇编程序:32位系统中如何使用段?,memory,assembly,x86,memory-segmentation,Memory,Assembly,X86,Memory Segmentation,据我所知,早在16位PC的时代,我们的段寄存器包含每种类型段的地址,您可以使用类似SS:[EDI]的内容访问偏移量,这将把EDI中包含的值作为堆栈段的偏移量 现在我知道,在32位系统中,我们有GDT(全局描述符表)和LDT(本地描述符表),段现在包含到该表中的索引,并且可以计算一个指向正确内存地址的偏移量 我的理解正确吗 推送DWORD PTR SS:[EBP+8];basicbof.00401000 那么像这样的语句在32位操作系统(XP SP2)上意味着什么呢?段寄存器现在包含选择器。每个选

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

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

我的理解正确吗

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


那么像这样的语句在32位操作系统(XP SP2)上意味着什么呢?

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

例如:

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

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

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


编辑:

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

苏克鲁的回答是我记得的


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

注意,SS DS ES等选择器在user land中没有意义,因为它们指向相同的(通常为4-kbyte)页面。我不知道内核编程是怎么回事