元のコードはわかりませんが、右シフトと腹筋でこれほど複雑だとは思いません。
これは、名前が変更された逆コンパイルされた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
編集:私は自分で答えを見つけました.シフト32>> 32
は、32ビットDWORDまたはそのようながらくたに一致するタイプの古いCコンパイルサポートのために追加された役に立たないガベージであるようです.