lwz 到底发生了什么?

What is actually happening in lwz?

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

lwz       r4, dword_91C0DB28@l(r28)

双字在 IDA 中的显示方式

dword_91C0DB28: .long 0    

调用 lwz 时到底发生了什么,为什么有用?

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

不对,以上答案不正确。

IDA指令:

lwz       r4, dword_91C0DB28@l(r28)

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

原指令:

lwz        r4, -12345(r28)

这一刻真正的指令会像上面那样。
您在 IDA 上看到的地址0x91C0DB28 将在运行时由 $r28 - 12345 生成。
(偏移-12345只是一个例子)

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