Assembly 什么是;DS:[40207A]”;在组装中是什么意思?

Assembly 什么是;DS:[40207A]”;在组装中是什么意思?,assembly,x86,memory-address,Assembly,X86,Memory Address,DS:是什么意思?内存地址由一个段和一个偏移组成;DS是“数据段”寄存器 指令正在从位于ds:[40207A]的内存加载新的EIP值。i、 e.在地址40207A处有一个函数指针。(它推送一个返回地址,因为这是一个调用,而不仅仅是jmp) ds:意味着指令引用的是数据段中的内存,在现代操作系统上几乎可以忽略,因为它们使用平面地址空间模型运行(代码、数据和堆栈段都引用相同的内存范围,内存保护通过分页处理) ds:显示它肯定是一个内存操作数,并提醒您它使用哪个段/显示没有段覆盖前缀(可能除了ds前缀

DS:
是什么意思?

内存地址由一个段和一个偏移组成;DS是“数据段”寄存器

指令正在从位于
ds:[40207A]
的内存加载新的EIP值。i、 e.在地址
40207A
处有一个函数指针。(它推送一个返回地址,因为这是一个
调用
,而不仅仅是
jmp

ds:
意味着指令引用的是数据段中的内存,在现代操作系统上几乎可以忽略,因为它们使用平面地址空间模型运行(代码、数据和堆栈段都引用相同的内存范围,内存保护通过分页处理)

ds:
显示它肯定是一个内存操作数,并提醒您它使用哪个段/显示没有段覆盖前缀(可能除了
ds
前缀,因为这已经是默认值)

编辑: 稍微细化一下-请注意,为了保持简单,这是在运行Windows的32位保护模式的上下文中实现的

段寄存器(CS、DS、SS、ES、FS、GS)包含指向
描述符的
选择器
。有两个描述符表:global()和local(),选择器有一个位指示使用哪一个。Windows(几乎?)只使用全局表

描述符基本上是一个{起始地址,大小}对-还有更多,但这超出了本文的范围

Windows使用:每个进程都有一个4GB的地址空间,从内存地址0开始,并用于将进程彼此隔离

由于进程具有这种平面的世界视图,因此它们使用{0,4GB}描述符与所有段一起运行,因此,Windows不能分配每个进程描述符,而只能使用少数全局描述符,并让所有进程都使用这些描述符

编辑2: 该格式定义了与x86
无关的
——即使存在一些概念重叠。PE EXE可以有您想要的几乎任何部分布局,但通常是分成(至少)代码(读/执行)、数据(读/写)、资源(只读?)。将可执行文件拆分为多个部分可以对内存范围应用x86页级内存保护

编辑3: 虽然每个进程的正常段不会改变,但Windows使用
FS
寄存器指向每个线程的结构

编辑4:
有关概述,请参阅。这是来自80386上的一个旧文档,但信息仍然适用。

PE可执行文件有多个部分,但这些部分与x86段无关。我一直认为它们是一样的,你能详细说明一下区别吗?@wamp:好了,希望能回答你的问题:)不,CPU具有通过LGDT/SGDT、LLDT/SLDT指令访问的内部GDTR/LDTR寄存器。FS和GS是80386上引入的额外段,对CPU没有内在意义;选择名称是因为我们已经有了ES(“额外”段)。您能解释一下段描述符是怎么说的吗:
z1ds0023bit0(FFFFFFFF)
从ollydbg转储的。
0040103A   CALL DWORD PTR DS:[40207A]                USER32.MessageBoxA