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