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

wam*_*amp 21 x86 assembly memory-address

0040103A   CALL DWORD PTR DS:[40207A]                USER32.MessageBoxA
Run Code Online (Sandbox Code Playgroud)

什么DS:意思?

sne*_*rch 28

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

编辑:

一点点阐述 - 请注意,为了简单起见,这是在运行Windows的32位保护模式的上下文中.

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

一个描述符基本上{开头地址,大小}对-还有更多的它,但是这是这篇文章的范围之外.

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

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

编辑2:

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

编辑3:

虽然普通段不会按进程更改,但Windows使用FS寄存器指向每线程 TIB结构.

编辑4:

请参见的概述.这是来自80386上的旧文档,但信息仍然适用.

  • PE可执行文件有多个**部分**,但这些部分与x86**部分**无关. (2认同)

Gin*_*kas 5

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