26
0040103A   CALL DWORD PTR DS:[40207A]                USER32.MessageBoxA

是什么DS:意思?

4

2 回答 2

35

该指令正在从内存中加载一个新的 EIP 值ds:[40207A]。即在 address 有一个函数指针40207A。(它会推送一个返回地址,因为这call不仅仅是一个jmp.)

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

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

编辑:

稍微详细说明一下 - 请注意,为简单起见,这是在运行 Windows 的 32 位保护模式的上下文中。

段寄存器(CS,DS,SS,ES,FS,GS) 持有selector指向 a的descriptor. 有两个描述符表:全局(GDT)和本地(LDT),选择器有一个位指示使用哪个。Windows(几乎?)专门使用全局表。

描述符基本上一个{ beginning-address, size}对——还有更多内容,但这超出了本文的范围。

Windows 使用平面内存模型:每个进程都有一个从内存地址 0 开始的 4GB 地址空间,并使用分页将进程彼此隔离。

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

编辑2:

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

编辑 3:

虽然普通段不会在每个进程中更改,但 Windows 使用FS寄存器来指向每个线程的 TIB结构。

编辑4:

有关概述,请参阅此内容。这是来自 80386 上的旧文档,但该信息仍然适用。

于 2010-09-29T07:56:08.520 回答
4

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

于 2010-09-29T07:54:54.617 回答