【问题标题】:How to do the address calculation?如何进行地址计算?
【发布时间】:2018-03-20 04:38:32
【问题描述】:

我从一个网站上看到了这个案例:

cmpl $0x0,-0x20(%ebp)

jne xxx (program terminated   so -0x20(%ebp) == 0)

cmpl $0x1,-0x1c(%ebp)

jne xxx (program terminated   so -0x1c(%ebp) == $1)

然后:

lea -0x18(%ebp),%ebx

mov -0x4(%ebx),%eax

网站说 %eax = -0x4(%ebx) = -1c(%ebp) == $0

所以我不知道为什么 -0x4(-0x18(%ebp)) 将等于 -1c(%ebp) 请帮忙,谢谢!

【问题讨论】:

  • 0x18 + 0x4 = 0x1c。 (十进制,24+4 = 28)。这就是你要问的全部吗?
  • 听起来该网站试图传达您可以从存储在寄存器 ebx 和 ebp 中的两个不同基址读取相同的内存位置,但谁知道您没有提供足够的信息。
  • 它真的说 -1c(%ebp) 是 0,还是一个错字?因为在代码第 4 行的注释中,它说它是 1。
  • @Rafael ebx 是从ebp base -0x18 由lea 加载的,我认为提供的信息就足够了。这是错误的([ebx-4] 引用的结果值是 1,而不是 0)。

标签: assembly memory x86 hex att


【解决方案1】:

所以我不知道为什么 -0x4(-0x18(%ebp)) 会等于 -1c(%ebp) 请帮忙,谢谢!

字面意义上的-0x4(-0x18(%ebp)) 在x86 汇编语法中没有任何意义,因此它也不能等于-1c(%ebp)

所以这取决于你在“-0x4(-0x18(%ebp))”下理解的内容

有两种合乎逻辑的方式来评估它(猜测你的意思)。

1) 取消引用ebp-0x18,并使用内存中的该值(您的问题中未知)作为内存地址,将其调整为-4 并再次取消引用该地址=这与您的其余问题文本和代码一起没有意义提供,所以如果你这样理解它,你就走错了方向。

2)计算值ebp-0x18,然后添加另一个-0x4,然后将该值取消引用为内存地址(从内存中加载值)=这是更明智的一个,与您发布的其他内容相关。 IE。只发生一次取消引用。它不会使该表达式成为有效的 ASM 语法,它只是在像这样评估时才有意义。

那么最终地址等于ebp - 0x18 - 0x04,可以简化为ebp - 0x1C。正如 Peter Corder 评论的那样,它就像 24 + 4 = 28 (0x18 + 0x04 = 0x1C) 一样简单。

如果您确实按照 1) 中的描述理解了它,那么您可能误解了lea 指令?已经有一些关于它的问题:
What's the purpose of the LEA instruction?(有几个很好的答案,每个都添加了一些细节)
What is the difference between MOV and LEA?

总而言之,lea 确实使用与mov 相同的内存操作数语法,但在计算内存地址之后(与mov 指令相同),它会停在那里并将作为结果,地址值本身进入目标寄存器。它不联系内存芯片获取值(不取消引用)。 mov 指令继续前进,从内存中获取最终值,并将其存储到目标寄存器中。

最后,正如 prl 评论的那样,通过代码的第一部分,地址 ebp-0x1c 的内存值是 1,而不是 0。必须是您这边的拼写错误,或者是网络作者。也许在第一个版本中,他确实使用 -0x1c 表示 lea,然后 mov 将从 ebp-0x20 获取 0。然后通过引入第三个偏移量 -0x18 并忘记将mov 偏移量调整为 -8 或结果调整为 1 使其不那么明显?只是猜测。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多