Всем хай! Как известно fasm убирает код неиспользуемых процедур, в результате чего программа получается чистой (т.е. ничего лишнего). Вопрос у меня возник следующий: можно ли сделать тоже самое в масме и/или сях (комментировать код тоже неплохо, но доставляет некоторый геморрой). Спасибо
ИМХО за удаление неиспользуемого кода отвечает ключ линкера /OPT:REF. А /Gy просто делает возможным нормальную его работу. В mscm скорее всего тоже получится такое, если каждую функцию писать в отдельном файле
На самом деле функции выкидывает линкер, а чтобы он так смог сделать нужно чтобы функция в обьектнике была в отдельном сегменте, т.е. чтобы в исходнике была нормально обозвана как PROC а не как просто метка.
как заставить сишный оптимизатор сохранять регистры на процедурах? чё уже только не пробовал, хоть вставки асмовые вставляй (нужно чтобы 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): int __stdcall _dialogproc(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam) { switch((WORD)wMsg) { case WM_INITDIALOG: break; case WM_CLOSE: EndDialog(hWnd,NULL); break; default: return false; } return true; } void __stdcall WinMainA(void) { DialogBoxParam(hInstance,MAKEINTRESOURCE(ID_DLGMAIN),NULL,_dialogproc,NULL); ExitProcess(NULL); } ps. спасибо за помощь
А что за компилятор? msvc++ 7.0 очень даже сохраняет ebx. Такие вещи не отключаются, насколько я знаю.
7.10.3077, у меня из-за этого программа не работает должным образом на win2k (из-за несохранения ebx) 118617188__screen.rar
Avoidik И правильно компилятор делает что не сохраняет. Зачем, если в коде твоей ф-ции он не меняется, и вызываемые из неё ф-ции его не меняют (т.е. не должны менять).
EndDialog должна сохранять ebx, как и все АПИшние ф-ции. imho нужно найти причину, а не пытаться сохранять ebx в диалоговой ф-ции.
регистр должна сохранять/восстанавливать функция, которая его использует, а не DlgProc должна за всех отдуваться. Все правильно делает компилятор. DlgProc не использует - значит и не обязана сохранять.
green, я привёл EndDialog ради примера, на самом деле проблема в следующем файле (см. аттач), судя по всему EnumChildWindows изменяет ebx и не восстанавливает его, далее после вызова из EnumChildWindows мы покидаем, так называемый, _dlgproc и уходим в user32, далее получаем в нём исключение (test byte ptr ds:[ebx+2B], 0C0 - access violation), в следствие чего, программа не работает на win2k (в win9x, xp, 2k3 всё ок) _520862708__control.rar
Avoidik Ты передаёшь неправильный callback в EnumChildWindows. EnumChildProc берет 2 параметра. Код (Text): BOOL CALLBACK EnumChildProc(HWND hwnd, [b]LPARAM lParam[/b]);