вопрос про оптимизацию

Тема в разделе "WASM.A&O", создана пользователем Avoidik, 26 фев 2006.

  1. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    Всем хай!



    Как известно fasm убирает код неиспользуемых процедур, в результате чего программа получается

    чистой (т.е. ничего лишнего). Вопрос у меня возник следующий: можно ли сделать тоже самое в

    масме и/или сях (комментировать код тоже неплохо, но доставляет некоторый геморрой). Спасибо
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Avoidik

    В MSVC - опция компилятора /Gy

    А то что MASM так не делает - это его плюс imho.
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    ИМХО за удаление неиспользуемого кода отвечает ключ линкера /OPT:REF.

    А /Gy просто делает возможным нормальную его работу. В mscm скорее всего тоже получится такое, если каждую функцию писать в отдельном файле :)
     
  4. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    На самом деле функции выкидывает линкер, а чтобы он так смог сделать нужно чтобы функция в обьектнике была в отдельном сегменте, т.е. чтобы в исходнике была нормально обозвана как PROC а не как просто метка.
     
  5. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    как заставить сишный оптимизатор сохранять регистры на процедурах? чё уже только не пробовал, хоть вставки асмовые вставляй (нужно чтобы ebx сохранялся в _dialogproc, а не хочет), компилю со следующими параметрами:



    /Og /Ob1 /Oi /Op /Os /GL /G6 /GA /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /GF /FD /ML /Fp".\Release/main.pch" /Fo".\Release/" /Fd".\Release/" /W3 /nologo /c /Gz /TP


    Код (Text):
    1.  
    2. int __stdcall _dialogproc(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam)
    3. {
    4.     switch((WORD)wMsg)
    5.     {
    6.     case WM_INITDIALOG:
    7.         break;
    8.  
    9.     case WM_CLOSE:
    10.         EndDialog(hWnd,NULL);
    11.         break;
    12.    
    13.     default:
    14.         return false;
    15.     }
    16.     return true;
    17. }
    18.  
    19. void __stdcall WinMainA(void)
    20. {
    21.     DialogBoxParam(hInstance,MAKEINTRESOURCE(ID_DLGMAIN),NULL,_dialogproc,NULL);
    22.     ExitProcess(NULL);
    23. }
    24.  




    ps. спасибо за помощь
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    А что за компилятор?

    msvc++ 7.0 очень даже сохраняет ebx. Такие вещи не отключаются, насколько я знаю.
     
  7. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    7.10.3077, у меня из-за этого программа не работает должным образом на win2k (из-за несохранения ebx)



    [​IMG] 118617188__screen.rar
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Avoidik

    И правильно компилятор делает что не сохраняет.

    Зачем, если в коде твоей ф-ции он не меняется, и вызываемые из неё ф-ции его не меняют (т.е. не должны менять).
     
  9. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    у меня в EndDialog'e меняется ebx, а не в самой процедуре (т.е. в системном вызове)
     
  10. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    EndDialog должна сохранять ebx, как и все АПИшние ф-ции.

    imho нужно найти причину, а не пытаться сохранять ebx в диалоговой ф-ции.
     
  11. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    регистр должна сохранять/восстанавливать функция, которая его использует, а не DlgProc должна за всех отдуваться. Все правильно делает компилятор. DlgProc не использует - значит и не обязана сохранять.
     
  12. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    green, я привёл EndDialog ради примера, на самом деле проблема в следующем файле (см. аттач), судя по всему EnumChildWindows изменяет ebx и не восстанавливает его, далее после вызова из EnumChildWindows мы покидаем, так называемый, _dlgproc и уходим в user32, далее получаем в нём исключение (test byte ptr ds:[ebx+2B], 0C0 - access violation), в следствие чего, программа не работает на win2k (в win9x, xp, 2k3 всё ок)

    [​IMG] _520862708__control.rar
     
  13. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Avoidik

    Ты передаёшь неправильный callback в EnumChildWindows.

    EnumChildProc берет 2 параметра.


    Код (Text):
    1. BOOL CALLBACK EnumChildProc(HWND hwnd, [b]LPARAM lParam[/b]);
     
  14. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    блин, реально ступил :) спасибо за помощь



    ps. на win2k заработало