对PowerPC的寄存器价值感到困惑?

时间:2014-03-06 23:03:11

标签: xbox360 powerpc

所以,我一直在学习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#,我不想放弃这个,因为尽管我遇到了麻烦,它仍然非常有趣。

1 个答案:

答案 0 :(得分:4)

我不理解评论“#r10 = r10(0x64)+ 0xFFFFFF80”中的'+',它可能是一个错字。但我理解下一行的评论,“#r31 = r11( 0xE3)& 0xFFFFFF80” 。

如果您查看PowerPC 2.02 Book 1 documentation'旋转左词立即然后和面具M形式',它会显示clrrwi实际执行的操作。

clrrwi Rx,Ry,n

相当于

rlwinm Rx,Ry,0,0,31-n

对于clrrwi,rlwinm向左旋转0位,因此clrrwi指令没有旋转。它生成一个0位的掩码,其他位置为0(位25-31),因此为n = 7生成的掩码为0xFFFFFF80。旋转的数据与生成的掩码进行AND运算,因此这就是第二个clrrwi的注释有意义的原因。 clrrwi正在生成一个掩码来清除一个字中的右n位,0xFFFFFF80是用于清除的掩码。

顺便说一句,0x34 + 0x7F = 0xB3。