试图在上下文 w 中理解这条指令。段寄存器

trying to understand this instruction in context w. Segment registers

我正在尝试理解这条指令:

 0x80496fa <yellow_preflight+18>:     mov    eax,ds:0x804c220

这些是运行时的寄存器值:

  EAX: 0x000000D2  EBX: 0xB7FB6FF4  ECX: 0xBFFFF438  EDX: 0xBFFFF3A4  o d I t S z A P c 
  ESI: 0x00000000  EDI: 0x00000000  EBP: 0xBFFFF468  ESP: 0xBFFFF450  EIP: 0x080496FF
  CS: 0073  DS: 007B  ES: 007B  FS: 0000  GS: 0033  SS: 007B

所以根据我的理解,如果这只是一个普通的 mov 指令 w/o 'ds:' 源地址中的前缀。然后 eax 应该保存 '0x0804c220' 价值。但是当我进一步执行时,eax 的值变为

EAX: 0xB7FB7440 

而不是预期值。所以我试图找到这种行为的解释。提前致谢。

ds:0x804c220是一个地址;该指令将该地址的值移动到 eax.

ds: 是所谓的段覆盖前缀

例如,假设您在源代码中写下了这个(NASM 语法):

mov eax, [0x804c220]

您没有使用段前缀,但汇编程序将使用默认段进行这种内存访问,ds(数据段)。它会自行将您的代码转换为:

 mov eax, [ds:0x804c220]

这就是为什么在源代码中使用 ds: 前缀对您的示例没有影响。但是当你使用不同的段覆盖前缀时,它就会有所不同。例如,在这种情况下,汇编程序将使用 fs 而不是默认的 ds 段:

 mov eax, [fs:0x804c220]