2011-08-18 153 views
1

我试图移植一个传统的应用程序,它有一些基本的位移解密缓冲区,但我失去了这个PowerPC代码 - 我尽我所能了解它,并添加了评论,并创建了一个伪然而,c函数显然是不正确的。了解PowerPC汇编器函数的位旋转

这是PPC功能,它有一个说法,我认为缓冲区(PARAMS是:void *的,INT)http://pastebin.com/RNRAWCpi

这是据我的伪C具有先进:

unsigned long long* data=(unsigned long long*)pBuffer; // file data 
unsigned long long crypt = 0x0000; 
unsigned long long next_crypt; 
unsigned int len = size >> 3; 

for(unsigned int i=0; i<len;i++) { 
    next_crypt = crypt+data[i]-0x9A6C9A19;  
    data[i] = ((data[i]<<0x18)|(data[i]>>0x14))+0x9A6C9A19; 
    data[i] = (data[i]<<0x3)|(data[i]>>0x29); 
    data[i] = data[i] - crypt; 
    crypt = next_crypt;  
} 

例如,crypt为什么分成两个寄存器r29 & r30

任何帮助将不胜感激。

回答

0

如果PowerPC是32位,那么需要将“long long”(64位)分成2个32位寄存器。你有其他具体问题吗?

+0

谢谢 - 你碰巧知道我的错误是与翻译到伪c函数?你能看到一个明显的错误吗? – Steve

+0

看来你的旋转是使用十进制格式,而你的C代码是十六进制格式“rotrwi r11,r10,14”(0x0E)14!= 0x14(20) –

+0

啊谢谢你,我没有看到 - 你碰巧知道powerpc asm社区这些问题是否更好? – Steve