2014-03-06 53 views
3

因此,我一直在學習用於Xbox的簡單反轉項目PowerPC,但我總是糾結於這樣的事情。與PowerPC的註冊表值相混淆?

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#,我不想放棄這個,因爲儘管我遇到了麻煩,但它非常有趣。

回答

4

我不理解評論「#r10 = r10(0x64)+ 0xFFFFFF80」中的'+',它可能是一個錯字,但我理解下一行的註釋「#r31 = r11 (0xE3)& 0xFFFFFF80「。

如果你看看PowerPC 2.02 Book 1 documentation的'旋轉左邊的字,然後用掩碼M-form',它會顯示實際上爲clrrwi做了什麼。

clrrwi的Rx,RY,正

相當於

rlwinm的Rx,RY,0,0,31-N

對於clrrwi,rlwinm旋轉離開字0的位,所以有沒有爲clrrwi指令做旋轉。它產生一個掩碼,0到24位爲1,其他位爲0(位25到31),所以n = 7產生的掩碼是0xFFFFFF80。旋轉的數據與生成的掩碼進行「與」運算,所以這就是第二個clrrwi的註釋有意義的原因。 clrrwi正在生成一個掩碼來清除一個字中正確的n位,並且0xFFFFFF80是用於執行清除的掩碼。

順便說一下,0x34 + 0x7F = 0xB3。

+0

謝謝!我仍然很困惑,但我到了那裏。並感謝更正0xE3,我想我讀錯了! – user3371785