Someone was telling me that if the decompiler can't generate recompilable code that runs the same as the assembly code does, then it's no good.

I'd like to discuss this.

First, if you have an assembly program and want to modify it, you'll typically just go to the place in the assembly code you want to change, and just patch it, either by modifying existing instructions. For instance, changing the condition of a branch to bypass copy protection.

Further, you might want to add code. In this case, you just put a JMP instruction, have it run new code at somewhere else in the binary, and then JMP back afterwards.

So with that point made, why decompile when you can't recompile?

Well, firstly, when modifying or adding code, you need to find out where to put it. The decompiler can help you with its interleaving assembly listing.

At the very least, the decompiler, even if not perfect code, gives you a better impression of what's going on.

And that's what's so great about RevEngE.