Народ вот частенько в инете натыкаюсь на исходники, в коде которых в начале процедур обычно сохраняются регистры в стек а по завершении достаются от туда... но так же натыкаюсь и на такие сорцы где в коде регистры уже не сохраняются меня это вводит в заблуждение и хотелось бы узнать, зачем вообще нужно сохранять ригистры и когда это нужно делать?
Для начала следует узнать зачем вобще регистры и что это такое, дальнейшие вопросы отпадут сами собой.
Clerkя знаю что такое регистры.... но вопросы у меня не отпадают... вот к примеру я взял код Владислава пирогова Код (Text): WNDPROC PROC PUSH EBP MOV EBP,ESP PUSH EBX PUSH ESI PUSH EDI PUSH DWORD PTR [EBP+14H]; LPARAM (lParam) PUSH DWORD PTR [EBP+10H]; WPARAM (wParam) PUSH DWORD PTR [EBP+0CH]; MES (message) PUSH DWORD PTR [EBP+08H];HWND (hwnd) CALL DefWindowProcA@16 POP EDI POP ESI POP EBX POP EBP RET 16 WNDPROC ENDP Здесь он кладет в стек регистры EBP,ESP,EBX,ESI,EDI, ну регисрт EBP понятно почему он кладет а остальные то зачем? В его книге я так и ненашел толкового обьяснения почему он так делает...
Это не он кладёт, это компилятор кладёт на котором он накликал этот кодес. Первое пролог для выделения локальных переменных и адресации входных параметров, апи сохраняют регистры Ebx, Esi, Edi, Ebp.
нетнет, кладёт регистры он сам =) У Пирогова такой стиль программухи - он пшет всё какбэ на приближенном языке, чтобы после дизассемблирования код осоо не менялся, директивы и макросредства использует поминимуму. регистры сохраняются в стеке, потомучто возможно функция их изменяет! Кста твой код не полный. Он лишь сообщения возвращаетсистеме. Если дописать туда ещё функция и прочих действий, то регистры будут точно изменяться. разные)) Проверяй всё в отладчике. Если не меняются - удаляй пуш\поп
Если они тебе не нужны то не сохраняй , только вопрос поточнее ставь ) почитай хотя бы про pusha и popa =\
В главной процедуре окна, и прочих callback функциях вызываемых win сохранять Ebx, Esi, Edi, Ebp обязательно, в остальных чисто твоих подпрограммах на твоё усмотрение. Зато можешь рассчитывать на то что win тоже сохранит эти регистры, когда ты вызовешь любое API. Остальные сохраняться не обязаны ни тобой ни win.
elestrago Наоборот: ESI, EDI и EBX должны быть сохранены callback функцией. А также флаг направления должен быть сброшен в нулевое состояние (если этот флаг был изменён). Главная процедура окна - это callback. А также любая процедура адрес которой отдаётся в систему, например: THREADPROC, DLGPROC, WNDENUMPROC, FONTENUMPROC и т.п.
С masm32 v10 идет help так вот там есть файлик "asmintro.chm" а в этом файлике есть раздел "Register Preservation Convention". Так вот там и написано, зачем их нужно сохранять.