【问题标题】:trying to understand this instruction in context w. Segment registers试图在上下文 w 中理解这个指令。段寄存器
【发布时间】:2015-02-25 03:08:22
【问题描述】:

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

 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

所以据我了解,如果这只是一个没有 源地址中的“ds:”前缀。然后 eax 应该持有 '0x0804c220' 价值。但是当我进一步执行时,eax 的值变成了

EAX: 0xB7FB7440 

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

【问题讨论】:

  • 这是 x86 程序集,对吧?
  • @ScottHunter 说得对

标签: assembly x86 gdb


【解决方案1】:

ds: 是所谓的段覆盖前缀

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

mov eax, [0x804c220]

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

 mov eax, [ds:0x804c220]

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

 mov eax, [fs:0x804c220] 

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 哈哈谢谢g。但这意味着 ds: 前缀对地址完全没有影响?那你为什么要写这样的代码而不是简单地跳过'ds:'前缀呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2019-01-02
    相关资源
    最近更新 更多