【问题标题】:What is actually happening in lwz?lwz中到底发生了什么?
【发布时间】:2016-03-30 18:46:16
【问题描述】:

我正在查看以下说明,但我似乎无法理解。我尝试阅读一些在线 PowerPC 指令参考资料,但它们对我来说不是很容易理解。

lwz       r4, dword_91C0DB28@l(r28)

dword 在 IDA 中的显示方式

dword_91C0DB28: .long 0    

调用 lwz 时究竟发生了什么,为什么它有用?

【问题讨论】:

  • lwz 在给定的内存地址加载一个字并将高 32 位清零。有什么不清楚的地方?
  • @SamiKuhmonen 如果我们要加载的地址是dword_91C0DB28,那么r28的目的是什么?
  • "我们要加载的地址是dword_91C0DB28"。它不是。 dword_91C0DB28 只是位移,而基地址在r28 中给出。有效地址为 base_address + sign_extend(displacement)。在这种情况下,r28 可能包含 dword_91C0DB28 所在部分的开头地址。
  • @Michael 这就是它显示的加载到 r28 lis r28, ((dword_91C0DB28+0x10000)@h) 中的内容。我仍然不确定它在计算什么或为什么需要这样做?

标签: assembly powerpc instructions


【解决方案1】:

lwz 将一个字从定义的内存地址加载到目标寄存器,并将高 32 位清零。在这种情况下,目标是r4,内存地址是dword_91X0DB28 + r28

【讨论】:

  • 我现在明白了,@l@h 之后会加载我们 dword 的低位和高位。
  • @Aidan: 不,@l 采用 地址 的低 16 位,而不是指向的双字(实际上是 .long,单个 PowerPC 字) .大概r28首先用lis r28, foo@h初始化,以将高16位放入寄存器的顶部。
【解决方案2】:

不,上面的答案不正确。

IDA 指令:

lwz       r4, dword_91C0DB28@l(r28)

上面的指令访问内存dword_91C0DB28本身。
此内存地址由 IDA 的分析启发式计算得出。

原文说明:

lwz        r4, -12345(r28)

此时,真正的指令就像上面一样。
您在 IDA 看到的地址0x91C0DB28 将在运行时由$r28 - 12345 创建。
(偏移量 -12345 只是一个示例)。

仅供参考: 您可以使用 objdump 等愚蠢的反汇编程序查看原始指令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2012-08-29
    • 2021-03-18
    • 2018-08-25
    相关资源
    最近更新 更多