Takové malé úryvky nejsou příliš těžké na ruční dekompilaci. Zkusme to.
Už jste zjistili, že cl
obsahuje znak, to znamená, že eax
, ze kterého se čte, je ukazatel na znak pole. Říkejme tomu p
. Nyní udělejme hloupý překlad pro každý výpis sestavy do C:
l1:; 11: mov cl, [eax]; cl = * p; cmp cl, ''; if (cl < '') jb short l2; přejít na l2cmp cl, ','; if (cl! = ',') jnz short l3; přejít na l3l2:; l2: mov byte ptr [eax], ''; * p = '' l3:; l3: mov cl, [eax + 1]; cl = * (p + 1) včetně eax; p = p + 1test cl, cl; if (cl! = 0) jnz short l1; přejít na l1
A vyčistit:
l1: cl = * p; if (cl < '') goto l2; if (cl! = ',') goto l3; l2: * p = ''; l3: cl = * (p + 1); p = p + 1; if (cl! = 0) goto l1;
Nyní se podívejme na druhý if
. Má následující podobu:
if (podmínka) goto end_of_if; <if body>end_of_if:
A tady je návod, jak se můžeme zbavit goto
:
if (! Podmínka) {<if body> }
Použití na náš fragment:
l1: cl = * p; if (cl < '') goto l2; if (cl == ',') {l2: * p = ''; } cl = * (p + 1); p = p + 1; if (cl! = 0) goto l1;
Jak se můžeme zbavit goto l2
? Pokud se na to podíváte pečlivě, uvidíte, že tělo na l2
bude provedeno, pokud buď cl < ''
nebo cl == ','
. Můžeme tedy jen kombinovat dvě podmínky s logickým OR ( ||
):
l1: cl = * p; if (cl < '' || cl == ',') {* p = ''; }
cl = * (p + 1); p = p + 1; if (cl! = 0) goto l1;
Nyní nám zbývá jeden goto
. Máme: 1) štítek na začátku bloku výpisu 2) kontrola na konci bloku a 3) přechod na začátek bloku, pokud kontrola proběhla úspěšně. Toto je typický vzor smyčky do-while
a můžeme jej snadno převést:
do {cl = * p; if (cl < '' || cl == ',') {* p = ''; } cl = * (p + 1); p = p + 1; } while (cl! = 0)
Nyní je kód téměř pěkný a hezký, ale můžeme ho komprimovat o něco více nahrazením ekvivalentních příkazů:
do {if (* p < '' || * p == ',') * p = ''; cl = * ++ p;} while (cl! = 0)
A nakonec lze poslední podmínku přesunout do podmínky:
do {if (* p < '' || * p == ',') * p = '';} while (* ++ p! = 0)
Nyní je to zřejmé co kód dělá: prochází řetězcem a nahrazuje všechny speciální znaky (ty s kódy menšími než 0x20 aka mezera) a čárkami mezerami.