【问题标题】:Trying to understand effective addressing in x86 assembly试图理解 x86 汇编中的有效寻址
【发布时间】:2013-02-25 23:30:51
【问题描述】:

我被问到以下问题,但我不明白它如何有足够的信息来回答。

“如果EAX包含00000200HEBX包含00000003H,数据段包含1000H,那么这条指令生成的有效地址是什么?”

MOV ECX,[ESI][EDI]

我如何知道ESIEDI 寄存器中包含哪些值? 我知道ESIEDI 寄存器通常用于字符串操作...

我也知道创建有效地址的一般格式是:

1) 将DS 左移四位。

2) 将移位后的DS 值添加到偏移值。

在上面的代码 sn-p 中,偏移量是[ESI][EDI],我相信它与[ESI + EDI] 相同。我将[ESI][EDI] 解释为英语中的以下含义:

“偏移量等于ESI 寄存器中包含的值加上EDI 寄存器中包含的值。”

这是我参加为期 8 周的 x86 微处理器课程的第一周,因此非常感谢您的反馈。

【问题讨论】:

  • DSI? 80x86 中没有 DSI 寄存器。
  • 我之前的评论提到了原始的、未经编辑的问题。我已将其删除以防止进一步混淆。

标签: assembly x86 cpu-registers


【解决方案1】:

ds:eax+ebx的有效地址可以这样计算:

ds =  0x1000 (4096 in decimal)
eax = 0x200  (512 in decimal)
ebx = 3

ds:eax+ebx = 0x10 * 0x1000 + 0x200 + 3

ds:eax+ebx = 0x10203 (66051 decimal)

但是根据dseaxebx的值,esiedi的值不能说,因为寄存器是完全独立的,所以@987654328的有效地址@ 也不能计算。

【讨论】:

  • 如果它是保护模式,那么从data segment contains 1000H 我们无法判断段基地址是什么,除非我们得到 GDT 的内容。
  • @AlexeyFrunze 好点。我的回答只对实模式有效。
  • 我在实模式下工作。我了解您如何获得 DS:[EAX][EBX]。我认为最初的问题是缺少信息,因为我们如何在不被告知的情况下知道 [ESI] 和 [EDI] 是什么?
  • @JJBladester 无法从dseaxebx 中推断出esi 和/或edi。所以你被问到的问题是缺少信息。
  • @nrz 我实际上得到了这本书的作者。你是对的,问题是缺少信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多