【问题标题】:What does MOV EAX,DWORD PTR DS:[ESI+EBP*8] do?MOV EAX,DWORD PTR DS:[ESI+EBP*8] 有什么作用?
【发布时间】:2015-01-25 03:11:50
【问题描述】:

如果我在 Ollydbg 中单步调试调试器,我会看到

MOV EAX,DWORD PTR DS:[ESI+EBP*8]

并注册 ESI = 0040855C 和 EBP = 00000000。

我的问题是我不知道 2 register * 8

【问题讨论】:

  • 不确定是什么让您感到困惑。它只是从地址esi+ebp*8 的内存中加载一个双字,这当然是0040855C,因为ebp 为零。 (您可能记得在学校时乘法优先。)

标签: debugging assembly ollydbg


【解决方案1】:

MOV EAX,DWORD PTR DS:[ESI+EBP*8]

MOV - 移动

EAX - 到 EAX(通常这将是您刚刚计算的值)

DWORD PTR - 从指向的值

[DS: - 在数据段中]

[ESI+EBP*8] - ESI 加 8 倍 EBP。

将EAX中的值移动到ESI + EBP*8所指向的地址中(ESI加上8倍EBP,就是这么写的意思)

这可能用于从数组加载数据,其中 8 用于将计数器(即 EBP)放大到所存储事物的大小(8 字节),而 ESI 包含数组的开始。因此,如果 EBP 为零,则将数据存储在 ESI+0 中,如果 EBP=1,则最终存储在 ESI+8 中,等等。

【讨论】:

  • 你答案的最后一段是错误的!您必须交换 ESI 和 EBP。此外,正常的 INTEL 语法规定第一个操作数是目标。 (见我的回答)
  • 啊,我的错,修复了!我已经很久没有搞乱英特尔汇编了,我有点假设 EBP 基指针加上 ESI 索引,因为这是使用它们的更常见方式。
【解决方案2】:

在正常的 INTEL 语法中,该指令将值 内存 移入 EAX。

MOV EAX,DWORD PTR DS:[ESI+EBP*8]

它通常用于从数组中提取一个值。
该数组位于 DS:ESI 的内存中。
元素通过 EBP 进行索引。
8 表示每个元素都是 64 位长,该指令只读取低位 dword。

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 2012-08-21
    • 2014-10-28
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2013-03-05
    • 2015-03-04
    • 2014-03-02
    相关资源
    最近更新 更多