所以,我一直在学习 PowerPC 来完成 Xbox 的简单逆向项目,但我总是对这样的事情感到困惑。
lwz r11, 0(r29) # Loads 0x34 from 0x10710 and stores in r11
lwz r10, 4(r29) # Loads 0x64 from 0x10714 and stores in r10
addi r11, r11, 0x7F # r11 = 0x34 + 0x7F = r11 = 0xE3
clrrwi r10, r10, 7 # r10 = r10 (0x64) + 0xFFFFFF80
clrrwi r31, r11, 7 # r31 = r11 (0xE3) & 0xFFFFFF80
无论如何,我无法理解的是最后两行。寄存器怎么可能有一个值+另一个值?另一个寄存器怎么可能有一个值和另一个值?如果我将加法作为下一行,我会添加什么值?抱歉,这是一个奇怪的转变,因为我的母语是 C++ 和 C#,我不想放弃这个语言,因为尽管我遇到了麻烦,但它还是很有趣。
我不明白注释“# r10 = r10 (0x64) + 0xFFFFFF80”中的“+”,这可能是一个拼写错误。但我理解下一行的注释,“# r31 = r11 (0xE3) & 0xFFFFFF80”。
如果你看一下PowerPC 2.02 第 1 册文档 http://www.ibm.com/developerworks/systems/library/es-archguide-v2.html对于“Rotate Left Word Immediate then AND with Mask M-form”,它显示了 clrrwi 的实际操作。
clrrwi Rx,Ry,n
相当于
rlwinm Rx,Ry,0,0,31-n
对于 clrrwi,rlwinm 向左循环字 0 位,因此 clrrwi 指令不进行循环。它生成一个掩码,其中位 0-24 为 1,其他位置(位 25-31)为零,因此为 n=7 生成的掩码为 0xFFFFFF80。旋转的数据与生成的掩码进行 AND 运算,因此这就是第二个 clrrwi 的注释有意义的原因。 clrrwi 生成一个掩码来清除一个字中的右 n 位,0xFFFFFF80 是用于清除的掩码。
顺便说一下,0x34+0x7F=0xB3。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)