void sub_401080(DWORD arg_4) { DWORD var_c; sub_401440(); __main(); switch (arg_4) { case 7: var_c = "Seven!"; goto loc_4010D0; case 6: var_c = "Six!"; goto loc_4010D0; case 5: var_c = "Five!"; goto loc_4010D0; case 4: var_c = "Four!"; goto loc_4010D0; case 3: var_c = "Three!"; goto loc_4010D0; case 2: var_c = "Two!"; loc_4010D0: puts((void *)var_c); return; } var_c = "Other!"; goto loc_4010D0; }//sub_401080(:[1])
This will compile with little effort, and looks like it will run correctly. Obviously, the goto statements are unfortunate. However, this is possibly because the author has not tested before on gcc-compiled input programs.
I'm not sure where the binary for this program came from; it is in a file called switch_gcc.dc
. To give some idea of the original binary, this is the assembler view:
sub_401080 proc near mov [eax], ebp mov eax, 0 mov ebp, esp sub esp, 8 and esp, 0FFFFFFF0h mov [eax-4], ebx mov ebx, [eax+8] call sub_401440 call __main cmp ebx, 7 ja loc_4010E0 T32 = ebx * 4, T32 = &off_4010A8 + T32, (*T32) loc_40110D: mov dword ptr [eax], offset aSeven jmp loc_4010D0 loc_40110D4: mov dword ptr [eax], offset aSix jmp loc_4010D0 ... loc_4010C8: mov fdword ptr [eax], offset aTwo loc_4010D0: call puts mov ebx, [eax-4] mov eax, 0 mov esp, ebp mov ebp, [eax] ret loc_4010E0: mov dword ptr [eax], offset aOther jmp loc_4010D0 sub_401080 endp
This assembler code is like nothing I've seen; I suspect that esp is being displayed as eax and possibly some instructions are displayed out of sequence. This was from version 0.62; unfortunately the .dc
file won't read in later versions of the GUI.
It's a real shame that this decompiler doesn't seem to have progressed since May 2005.
-- MikeVanEmmerik - 24 Mar 2007