0040103A CALL DWORD PTR DS:[40207A] USER32.MessageBoxA
DS:
是什么意思?
最佳答案
该指令正在从内存 ds:[40207A]
加载新的 EIP 值。即地址 40207A
处有一个函数指针。 (它会推送返回地址,因为这是一个调用
,而不仅仅是一个jmp
。)
ds:
表示指令引用数据段中的内存 - 在现代操作系统上几乎可以忽略,因为它们使用平面地址空间模型(代码、数据和堆栈段)运行都引用相同的内存范围,内存保护是通过分页处理的)。
ds:
的作用是向您显示它绝对是一个内存操作数,并提醒您它使用哪个段/显示没有段覆盖前缀(可能除了 ds
前缀,因为这已经是默认值)。
编辑:
一点详细说明 - 请注意,为了简单起见,这是在运行 Windows 的 32 位保护模式的上下文中。
段寄存器(CS、DS、SS、ES、FS、GS)保存一个指向描述符
的选择器
。有两个描述符表:全局( GDT )和本地( LDT ),并且选择器有一个位指示要使用哪个。 Windows(几乎?)专门使用全局表。
描述符基本上是一个{beginning-address, size}对 - 还有更多内容,但这超出了本文的范围发布。
Windows 使用 Flat Memory Model :每个进程都有一个从内存地址0开始的4GB地址空间,并使用paging将进程彼此隔离。
由于进程具有这种平坦的世界 View ,因此它们使用 {0, 4GB} 描述符与所有段一起运行 - 因此,Windows 可以仅使用少数全局描述符并让所有进程使用,而不是分配每个进程描述符那些。
编辑2:
Portable Executable format 定义了 sections
,它们与 x86 segments
无关 - 即使存在一些概念上的重叠。 PE EXE 几乎可以具有您想要的任何部分布局,但正常情况是分为(至少)代码(读/执行)、数据(读/写)、资源(只读?)。将可执行文件分割成多个部分可以将 x86 页级内存保护应用于内存范围。
编辑3:
虽然普通段不会根据进程进行更改,但 Windows 使用 FS
寄存器来指向每个线程 TIB结构。
编辑4:
参见this以获得概述。这是来自 80386 的旧文档,但该信息仍然适用。
关于assembly - "DS:[40207A]"在汇编中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3819699/