0040103A CALL DWORD PTR DS:[40207A] USER32.MessageBoxA
DS:
是什么意思?
答案 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只能使用少数全局描述符并且所有进程都使用那些。
Portable Executable格式定义sections
,与x86 segments
无关 - 即使存在某些概念上的重叠。 PE EXE可以具有您希望的任何部分布局,但通常是分割成(至少)代码(读/执行),数据(读/写),资源(只读?)。将可执行文件拆分为多个部分可以将x86页级内存保护应用于内存范围。
虽然正常段不会按进程更改,但Windows使用FS
寄存器指向per 线程 TIB结构。
有关概述,请参阅this。这是来自80386上的旧文档,但信息仍然适用。
答案 1 :(得分:3)
内存地址由段和偏移量组成; DS是“数据段”寄存器。