Посл.ответ |
Сообщение |
Ранг: 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.04↘0.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.19↘0 Статус: Участник 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.19↘0 Статус: Участник
|
Создано: 07 января 2007 11:59 · Личное сообщение · #8 |
Ранг: 45.1 (посетитель) Активность: 0.03↘0 Статус: Участник
|
Создано: 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.04↘0 Статус: Участник
|
Создано: 07 января 2007 13:29 · Личное сообщение · #10
xDriver Не то... не то твой пример делает, если result после init_b не будет = 0 то exec не выполнится... а должен...
| Сообщение посчитали полезным: |
Ранг: 45.1 (посетитель) Активность: 0.03↘0 Статус: Участник
|
Создано: 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.04↘0 Статус: Участник
|
Создано: 07 января 2007 14:04 · Личное сообщение · #12
xDriver Да вроде тоже не то, default выполняется тока когда в case не найдено необходимых меток, опять же таки exec выполнятся не будет... вообще интересный пример, наверное все таки это надо каждый компилятор смотреть, хрен знает как он это построит...
| Сообщение посчитали полезным: |
Ранг: 45.1 (посетитель) Активность: 0.03↘0 Статус: Участник
|
Создано: 07 января 2007 14:12 · Личное сообщение · #13
Enigma
А вот тут ты не прав.
default выполнится в случае case 0: и result=!0 после init_b() потомучто нет break
также default выполнится если result после init_a() будет отличен от нуля.
| Сообщение посчитали полезным: |
Ранг: 88.3 (постоянный), 3thx Активность: 0.04↘0 Статус: Участник
|
Создано: 07 января 2007 14:21 · Личное сообщение · #14
xDriver Лана, ты в switch'е 0: изменяешь переменную для которой этот switch создан, компилятор такое не пропустит, а если и пропустит, ... херота наверное получится...
| Сообщение посчитали полезным: |
Ранг: 45.1 (посетитель) Активность: 0.03↘0 Статус: Участник
|
Создано: 07 января 2007 14:26 · Личное сообщение · #15
Enigma
Блин
switch отработал потом с result делай что хочешь, компилятору на это пох.
хотя ща проверю на Borland Builder 6.0 ....
| Сообщение посчитали полезным: |
Ранг: 88.3 (постоянный), 3thx Активность: 0.04↘0 Статус: Участник
|
Создано: 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.03↘0 Статус: Участник
|
Создано: 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): Ну ёклмн, правда, куда делась моя табуляция?
| Сообщение посчитали полезным: |