· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.UNIX —› Кто тут крутой? Неплохой тест для вас!

<< . 1 . 2 . 3 .

Посл.отвђт Сообщен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 в конце цикла).
Все, ессна, имхо.

<< . 1 . 2 . 3 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.061