|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Апр 16, 2004 21:02:26 вообще-то я так не подумал :) но все же интересно было бы узнать его мнение... p.s> а где это задание откопал? |
|
|
Дата: Апр 16, 2004 21:02:35 Relf с reversing.net попросил меня запостить его ответ здесь. ******************* Посмотрел твой пост на васме. Не согласен с утверждением про начало цикла. Я утверждаю, что код был соптимизирован до:
// ...bla-bla-bla...
tmp = head->next;
// формальное начало for(;;) здесь
if (tmp == head)
goto do_not_loop;
struct dentry * dentry = list_entry(tmp, struct dentry, d_hash);
optimized_for_start:
tmp = tmp->next;
if (dentry->d_name.hash != hash)
goto loop_continue;
if (dentry->d_parent != parent)
goto loop_continue;
if (parent->d_op && parent->d_op->d_compare) {
if (parent->d_op->d_compare(parent, &dentry->d_name, name))
goto loop_continue;
} else {
if (dentry->d_name.len != len)
goto loop_continue;
if (memcmp(dentry->d_name.name, str, len))
goto loop_continue;
}
__dget_locked(dentry);
dentry->d_vfs_flags |= DCACHE_REFERENCED;
spin_unlock(&dcache_lock);
return dentry;
loop_continue:
struct dentry * dentry = list_entry(tmp, struct dentry, d_hash);
if (tmp != head)
goto optimized_for_start
do_not_loop:
spin_unlock(&dcache_lock);
return NULL;
}
Теперь непосредственно по адресам: // ... bla-bla-bla ... c015b780: mov (%edx),%ebp ; tmp = head->next; // формальное начало for(;;) здесь c015b782: cmp %edx,%ebp ; if (tmp == head) c015b784: lea 0xfffffff0(%ebp),%ebx ; struct dentry * dentry = ... c015b787: je c015b82e <d_lookup+0x10e> ; goto do_not_loop c015b78d: lea 0x0(%esi),%esi ; align 16 optimized_for_start: c015b790: mov 0x8(%esp,1),%edx ; %edx = head c015b794: mov 0x0(%ebp),%ebp ; tmp = tmp->next; c015b797: cmp %edx,0x44(%ebx) ; if (dentry->d_name.hash != hash) c015b79a: jne c015b822 <d_lookup+0x102> ; goto loop_continue // ... bla-bla-bla ... c015b81e: mov %ebx,%eax c015b820: jmp c015b837 <d_lookup+0x117> ; return dentry; loop_continue: c015b822: cmp (%esp,1),%ebp ; if (tmp != head) c015b825: lea 0xfffffff0(%ebp),%ebx ; struct dentry * dentry = ... c015b828: jne c015b790 <d_lookup+0x70> ; goto optimized_for_start do_not_loop: c015b82e: movb $0x1,0xc02fb398 ; spin_unlock(&dcache_lock); // ... bla-bla-bla ... Как видим, break вообще исчез из кода - в противоречие с тем, что утверждается на васм. |
|
|
Дата: Апр 16, 2004 21:05:05 Как видим, break вообще исчез из кода - в противоречие с тем, что утверждается на васм. Только противоречия я тут, как ни смотрел, так и не увидел... |
|
|
Дата: Апр 16, 2004 22:10:53 volodya Противоречие? Тут считают, что цикл начинается там, куда указует "c015b828: jne c015b790 <d_lookup+0x70>". И у меня тоже было такое мнение. В любом случае это ничего не меняет и в задании не сказано реверсировать. Relf считает адрес c015b790 не началом цикла, а наследием оптимизации, и, как мне _теперь_ кажется, он прав, поскольку: 1) цикл for начинается по-крайней мере там, где начинается код, заключенный внутри цикла; 2) утверждение, что это не вольность компилятора, а именно оптимизация (по скорости), законно, так как выигрыш в скорости таки дает (хоть и небольшой: условные переходы вверх вначале прогнозируются процессором как taken, в отличие от переходов вниз; еще к тому же устраняется иначе необходимый jmp в конце цикла). Все, ессна, имхо. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.061 |