我不知道原始代码,但我不相信右移和 abs 会这么复杂。
这是重命名的反编译 IDA PRO 代码的样子
char Ship; //Could be 0-7 (8 is reversed for special purpose)
char NewShip = 1; //Could be 0-7 (8 is reversed for special purpose)
short Frequency = 0; //This could be from 0 to 9999
bool NumberToFrequency = true;
Frequency = GetNextFrequencyToJoin(player->MyArena);
if ( NumberToFrequency )
{ //TODO: maybe the below is just Frequency % 7; ?
NewShip = (((unsigned long)Frequency >> 32) ^ abs(Frequency) & 7) - ((unsigned long)Frequency >> 32);
Ship = NewShip;
} else {
Ship = NewShip;
}
这是一个 IDEOne 测试http://ideone.com/Q2bEjU
似乎NewShip = abs(frequency) & 7);
是我真正需要的一切似乎我通过循环测试了所有可能性,它永远不会搞砸。
另一个反编译器给了我这个结果
asm("cdq ");
NewShip = ((Var1 ^ Var2) - Var2 & 7 ^ Var2) - Var2;
哪个没有右移或任何东西对我来说仍然看起来很陌生,可能显示了绝对数字是如何工作的,但仍然不知道右移 32 的来源。
假设NumberToFrequency
要做的是使频率与船舶相同,但当然频率超过 7,因此剩余值仍应转换为船舶值,因此我假设它只是%
7 的模数。
但是为什么这么复杂的代码可能意味着完全不同的东西呢?我只是问代码是什么意思。我将在下面添加汇编代码。我什至在下面的程序集中找不到 Shift right 32 我很确定它在同一个地方。
.text:0040DD3A mov ecx, [ebp+1Ch] ; arena
.text:0040DD3D call GetNextFrequencyToJoin
.text:0040DD42 mov ecx, [ebp+1Ch]
.text:0040DD45 mov si, ax
.text:0040DD48 mov [esp+220h+var_20C], si
.text:0040DD4D cmp [ecx+1ACCEh], ebx
.text:0040DD53 jz short loc_40DD98
.text:0040DD55 movsx eax, si
.text:0040DD58 cdq
.text:0040DD59 xor eax, edx
.text:0040DD5B sub eax, edx
.text:0040DD5D and eax, 7
.text:0040DD60 xor eax, edx
.text:0040DD62 sub eax, edx
.text:0040DD64 mov [esp+220h+var_20F], al
编辑:我自己找到了答案,似乎那些 shift 32>> 32
是为一些旧的 C 编译支持添加的无用垃圾,其类型匹配 32 位 DWORD 或类似的废话。