“DS:[40207A]”在汇编中意味着什么?

时间:2010-09-29 07:52:06

标签: assembly x86 memory-address

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

DS:是什么意思?

2 个答案:

答案 0 :(得分:26)

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

编辑:

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

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

描述符 基本 {起始地址,大小} 对 - 还有更多内容,但这超出了此范围交。

Windows使用Flat Memory Model:每个进程都有一个4GB的地址空间,从内存地址0开始,并使用paging隔离进程。

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

编辑2:

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

编辑3:

虽然正常段不会按进程更改,但Windows使用FS寄存器指向per 线程 TIB结构。

编辑4:

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

答案 1 :(得分:3)

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