Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых)

 eXeL@B —› Программирование —› Помогите структурировать код
Посл.ответ Сообщение

Ранг: 3.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 января 2007 09:38 · Поправил: iZzz32
· Личное сообщение · #1

Помогите структурировать такой код:

result = init_a();
if (result != 0) goto work;
result = init_b();
if (result == 0) goto exit; /* Никак не получается? Ну и чёрт с ним. */
convert_to_a(result);
work:
exec(result); /* Делаем нечно ужасное… ^_^ */
exit:





Ранг: 114.4 (ветеран), 21thx
Активность: 0.040.01
Статус: Участник

Создано: 07 января 2007 09:49
· Личное сообщение · #2

Что значит структурировать?

Что конкретно ты хочешь?



Ранг: 3.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 января 2007 09:56 · Поправил: iZzz32
· Личное сообщение · #3

Переписать без goto и меток. Код сгенерирован компилятором MSVC6. Я написал вариант (см. выше), но в оригинале определённо было как-то по-другому...



Ранг: 27.7 (посетитель), 2thx
Активность: 0.01=0.01
Статус: Участник

Создано: 07 января 2007 09:59
· Личное сообщение · #4

if(!(res=init_a()))exec(res);
else if(!(res=init_b())){convert_to_a(res);exec(res);}



Ранг: 3.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 января 2007 10:12
· Личное сообщение · #5

Вы меня не поняли. Что надо написать на сях, чтобы компилятор сгенерировал вот такой код:

call init_a
test eax,eax
jne work
call init_b
test eax,eax
je exit ;Никак не получается? Ну и чёрт с ним.
push eax
call convert_to_a
work:
push eax
call exec ;Делаем нечто ужасное...
exit:

Тут один вызов exec!




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 07 января 2007 10:55 · Поправил: HoBleen
· Личное сообщение · #6

iZzz32 пишет:
Что надо написать на сях, чтобы компилятор сгенерировал вот такой код:

Все зависит от компилятора. Разные компиляторы генерируют разный код и оптимизируют его по-разному (даже такой маленький отрывок кода). Тебе нужен тот же компилятор (+та же версия) что и у программистов, писавщих эту программу, тогда можно будет гадать какого именно вида был исходник.

А вообще зачем тебе это надо? Код ведь имеет ту же функциональность.



Ранг: 3.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 января 2007 11:04
· Личное сообщение · #7

HoBleen, есть у меня MSVC6!.. Пробовал с разными ключами разные варианты. Ну не генерирует он один exec никак! Зачем мне это надо? Просто интересно, как такое получилось у программиста, это писавшего.



Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 07 января 2007 11:59
· Личное сообщение · #8

Larry пишет:
Что значит структурировать?

. Чел явн0 0сн0в алг0ритмизации не знает.
iZzz32 пишет:
Тут один вызов exec!

Них не п0йму.И в исх0дном на си т0же один выз0в exec.
Выражайся п0нятнее.



Ранг: 45.1 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 07 января 2007 13:00 · Поправил: xDriver
· Личное сообщение · #9

result = init_a();
if (result == 0) {
result = init_b();
if (result!=0) convert_to_a(result);
} else {
exec(result);
}



Ранг: 88.3 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 07 января 2007 13:29
· Личное сообщение · #10

xDriver Не то... не то твой пример делает, если result после init_b не будет = 0 то exec не выполнится... а должен...



Ранг: 45.1 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 07 января 2007 13:43 · Поправил: xDriver
· Личное сообщение · #11

Enigma
Да просмотрел, спасибо
тада так:

result = init_a();
switch(result) {
case 0:
result = init_b();
if (result==0) break;
convert_to_a(result);
default:
exec(result);
}



ЕЛКИ ПАЛКИ НУ КОГДА ФОРМАТИРОВАНИЕ КОДА БУДЕТ, НЕВОЗМОЖНО ТАКОЕ ЧИТАТЬ.



Ранг: 88.3 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 07 января 2007 14:04
· Личное сообщение · #12

xDriver Да вроде тоже не то, default выполняется тока когда в case не найдено необходимых меток, опять же таки exec выполнятся не будет... вообще интересный пример, наверное все таки это надо каждый компилятор смотреть, хрен знает как он это построит...



Ранг: 45.1 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 07 января 2007 14:12
· Личное сообщение · #13

Enigma
А вот тут ты не прав.
default выполнится в случае case 0: и result=!0 после init_b() потомучто нет break
также default выполнится если result после init_a() будет отличен от нуля.



Ранг: 88.3 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 07 января 2007 14:21
· Личное сообщение · #14

xDriver Лана, ты в switch'е 0: изменяешь переменную для которой этот switch создан, компилятор такое не пропустит, а если и пропустит, ... херота наверное получится...



Ранг: 45.1 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 07 января 2007 14:26
· Личное сообщение · #15

Enigma
Блин
switch отработал потом с result делай что хочешь, компилятору на это пох.
хотя ща проверю на Borland Builder 6.0 ....



Ранг: 88.3 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 07 января 2007 14:29
· Личное сообщение · #16

if (res=init_a()) {
if (!(res=init_b())) // Если a - ху.во, делаем b
convert_to_a(res); // И если пиз.ато делаем b - делаем convert
}
if (!res) exec(res); // Если дожили досюда и res==0 то делаем exec

Лана, держи структуризатор :-D



Ранг: 45.1 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 07 января 2007 14:37
· Личное сообщение · #17

Enigma
Ну вообщем как я и говорил ... код рабочий
Компилятору на изменение result внутри switch фиалетово.



Ранг: 3.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 января 2007 00:53 · Поправил: iZzz32
· Личное сообщение · #18

Посмотрел. Вариант от xDriver забавен, но в нём та же проблема, что и в моём (с goto) - лишние jmp-ы после компиляции.
Вариант от Enigma:
if (!(r = init_a())) {
if ((r = init_b())) convert_to_a(r);
}
if (r) exec(r);

очень похож на PowerPC-шный вариант того же самого кода:
* "Note that in assembly language programming,
* generally means multiply..." (C) Stuart Ball

bl init_a * Зовём init_a.
mr. r30,r3 * Кладём результат в r30, ставим флаги в cr0.
bne work * Прыгаем, если не стоит (вроде бит 2?) в cr0.
bl init_b * Зовём init_b.
mr. r30,r3 * Кладём результат в r30, ставим флаги в cr0.
mcrf cr4,cr0 * Кладём флаги из поля 0 в поле 4 регистра cr.
beq cr4,chk_rslt * Прыгаем, если стоит бит 2 в cr4.
mr r3,r30 * Кладём результат обратно в r3 (первый параметр).
bl convert_to_a * Зовём convert_to_a.
chk_rslt:
beq cr4,exit * Прыгаем, если стоит бит 2 в cr4.
work:
mr r3,r30 * Кладём результат обратно в r3 (первый параметр).
bl exec * Зовём exec.
exit:

А как добиться от MSVC6 кода, приведённого в моём втором посте, мне, наверное, никогда не понять.
PS(оффтоп): Посоветуйте, пожалуйста, хорошие мануалки по программированию/реверсингу для PPC.
PPS(edit): Ну ёклмн, правда, куда делась моя табуляция?


 eXeL@B —› Программирование —› Помогите структурировать код
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати