Assembly lwz到底发生了什么?

Assembly lwz到底发生了什么?,assembly,powerpc,instructions,Assembly,Powerpc,Instructions,我正在看下面的说明,我似乎无法理解。我试着阅读了一些在线PowerPC指令参考资料,但它们对我来说不是很容易理解 lwz r4, dword_91C0DB28@l(r28) 这是德沃德在《艾达》中的表现 dword_91C0DB28: .long 0 调用lwz时到底发生了什么?它为什么有用?lwz从定义的内存地址将一个字加载到目标寄存器,并将上面的32位置零。在这种情况下,目标是r4,内存地址是dword_91X0DB28+r28lwz从定义的内存地址向目标寄存器加载一

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

lwz       r4, dword_91C0DB28@l(r28)
这是德沃德在《艾达》中的表现

dword_91C0DB28: .long 0    

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

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

否,以上答案不正确。

IDA说明:

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

原始说明:

在这一刻,真正的指令将如上所述。
您在IDA上看到的地址
0x91C0DB28
将在运行时由
$r28
-12345生成。
(偏移量-12345只是一个例子)。


仅供参考:您可以通过使用哑反汇编程序(如
objdump
)查看原始指令。不,上面的答案不正确。

IDA说明:

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

原始说明:

在这一刻,真正的指令将如上所述。
您在IDA上看到的地址
0x91C0DB28
将在运行时由
$r28
-12345生成。
(偏移量-12345只是一个例子)。


FYI:您可以使用哑反汇编程序(如
objdump

lwz
在给定的内存地址加载一个字,并将上面的32位置零)来查看原始指令。不清楚的是什么?@SamiKuhmonen如果我们要加载的地址是dword_91C0DB28,“我们要加载的地址是dword_91C0DB28”,那么在这种情况下,
r28
的用途是什么。不是
dword_91C0DB28
只是位移,而基址在
r28
中给出。有效地址为基址+符号扩展(位移)
r28
在这种情况下可能包含
dword\U 91C0DB28
所在节开头的地址。@Michael这是加载到r28
lis r28中显示的内容((dword\U 91C0DB28+0x10000)@h)
。我仍然不确定它在计算什么或者为什么需要这样做?
lwz
在给定的内存地址加载一个字,并将上面的32位置零。不清楚的是什么?@SamiKuhmonen如果我们要加载的地址是dword_91C0DB28,“我们要加载的地址是dword_91C0DB28”,那么在这种情况下,
r28
的用途是什么。不是
dword_91C0DB28
只是位移,而基址在
r28
中给出。有效地址为基址+符号扩展(位移)
r28
在这种情况下可能包含
dword\U 91C0DB28
所在节开头的地址。@Michael这是加载到r28
lis r28中显示的内容((dword\U 91C0DB28+0x10000)@h)
。我仍然不知道它在计算什么或者它为什么需要这样做?我现在明白了,
@l
@h
之后加载dword的低位和高位。@Aidan:不,
@l
取地址的低位16位,而不是指向dword的低位(实际上是
.long
,一个PowerPC字)。假定
r28
首先用
lis r28初始化,foo@h
将高16位放入寄存器顶部。我现在明白了,
@l
@h
之后加载dword的低位和高位。@Aidan:不,
@l
取地址的低16位,而不是指向dword的低位(实际上是
.long
,一个单独的PowerPC字)。大概
r28
首先用
lis r28初始化,foo@h
将高16位放入寄存器顶部。
lwz       r4, dword_91C0DB28@l(r28)
lwz        r4, -12345(r28)