assembly - "DS:[40207A]"在汇编中是什么意思?

标签 assembly x86 memory-address disassembly memory-segmentation

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/

相关文章:

assembly - 启用分页后的指令似乎未执行

c++ - 使用 OpenMP 的 x86 上的原子最小值

x86 - amd和intel程序员模型兼容性

assembly - aarch64 是否有不可缓存(=缓存旁路)加载或存储指令?

c++ - Znwm和ZdlPv在汇编中是什么意思?

c# - 了解 C# SIMD 输出

c - Nios II 汇编代码转 C

assembly - 为什么linux在entry_SYSCALL_64函数中从rcx寄存器读取ip寄存器?

memory - 32 位和 64 位架构上的寻址

c - TI AM335x内存地址定义头文件?