Второй ответ, так как вопрос сильно изменился.
Исходный код выглядит после удаления всего лишнего:
for (... ; ; ...)
{
...
if (...)
{
break;
}
ABC
LABEL_19:
DEF
}
XYZ;
goto LABEL_19;
Это точно так же, как:
for (... ; ; ...)
{
...
if (...)
{
XYZ;
}
else
{
ABC
}
DEF
}
Как только вы выполните эту перезапись, вы можете заменить goto LABEL_22
на простой break
.
РЕДАКТИРОВАТЬ: Или более явно:
for (... ; ; ...)
{
...
if (! (ESP & 3) )
{
// This line used to be located after the loop.
*(DWORD *)v11 = v12 + 4*cryptAnswer; // 111
}
else
{
if (v13 == 1)
{
...
}
else if (v13 == 2)
{
...
}
else if (v13 == 3)
{
...
}
}
// This is where LABEL_19 used to be.
v17 = ... // 222
}
Эмпирическое правило, когда вы переписываете код следующим образом: код должен выполнять те же действия в том же порядке, что и раньше. Вы просто не можете перемещать код вслепую, и чтобы сделать это, вы должны понимать поток кода. В этом случае, когда берется первый if
, сначала выполняется строка, помеченная // 111
, затем строка // 222
, ничего больше.