Вопрос по сохранности регистров...

Тема в разделе "WASM.BEGINNERS", создана пользователем elestrago, 5 июн 2009.

  1. elestrago

    elestrago New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    56
    Народ вот частенько в инете натыкаюсь на исходники, в коде которых в начале процедур обычно сохраняются регистры в стек а по завершении достаются от туда... но так же натыкаюсь и на такие сорцы где в коде регистры уже не сохраняются

    меня это вводит в заблуждение и хотелось бы узнать, зачем вообще нужно сохранять ригистры и когда это нужно делать?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Для начала следует узнать зачем вобще регистры и что это такое, дальнейшие вопросы отпадут сами собой.
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    elestrago
    Тебе надо прочитать про форматы передачи параметров в процедуры.
     
  4. elestrago

    elestrago New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    56
    Clerkя знаю что такое регистры.... но вопросы у меня не отпадают...

    вот к примеру я взял код Владислава пирогова

    Код (Text):
    1. WNDPROC PROC
    2.     PUSH EBP
    3.     MOV EBP,ESP
    4.     PUSH EBX
    5.     PUSH ESI
    6.     PUSH EDI
    7.     PUSH DWORD PTR [EBP+14H]; LPARAM (lParam)
    8.     PUSH DWORD PTR [EBP+10H]; WPARAM (wParam)
    9.     PUSH DWORD PTR [EBP+0CH]; MES (message)
    10.     PUSH DWORD PTR [EBP+08H];HWND (hwnd)
    11.     CALL DefWindowProcA@16
    12.     POP EDI
    13.     POP ESI
    14.     POP EBX
    15.            POP EBP
    16.     RET 16
    17. WNDPROC ENDP
    Здесь он кладет в стек регистры EBP,ESP,EBX,ESI,EDI, ну регисрт EBP понятно почему он кладет а остальные то зачем?
    В его книге я так и ненашел толкового обьяснения почему он так делает...
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    http://en.wikipedia.org/wiki/X86_calling_conventions
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Это не он кладёт, это компилятор кладёт на котором он накликал этот кодес. Первое пролог для выделения локальных переменных и адресации входных параметров, апи сохраняют регистры Ebx, Esi, Edi, Ebp.
     
  7. elestrago

    elestrago New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    56
    тоесть мне как бы необязательно сохранять эти ригистры у меня в главной процедуре окна.... так?
     
  8. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    нетнет, кладёт регистры он сам =) У Пирогова такой стиль программухи - он пшет всё какбэ на приближенном языке, чтобы после дизассемблирования код осоо не менялся, директивы и макросредства использует поминимуму.

    регистры сохраняются в стеке, потомучто возможно функция их изменяет!
    Кста твой код не полный. Он лишь сообщения возвращаетсистеме.


    Если дописать туда ещё функция и прочих действий, то регистры будут точно изменяться. разные)) Проверяй всё в отладчике. Если не меняются - удаляй пуш\поп
     
  9. Swat2k

    Swat2k Дима

    Публикаций:
    0
    Регистрация:
    14 май 2007
    Сообщения:
    64
    Если они тебе не нужны то не сохраняй , только вопрос поточнее ставь )
    почитай хотя бы про pusha и popa =\
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    В главной процедуре окна, и прочих callback функциях вызываемых win сохранять Ebx, Esi, Edi, Ebp обязательно, в остальных чисто твоих подпрограммах на твоё усмотрение. Зато можешь рассчитывать на то что win тоже сохранит эти регистры, когда ты вызовешь любое API. Остальные сохраняться не обязаны ни тобой ни win.
     
  11. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    elestrago
    Наоборот: ESI, EDI и EBX должны быть сохранены callback функцией. А также флаг направления должен быть сброшен в нулевое состояние (если этот флаг был изменён). Главная процедура окна - это callback. А также любая процедура адрес которой отдаётся в систему, например: THREADPROC, DLGPROC, WNDENUMPROC, FONTENUMPROC и т.п.
     
  12. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    С masm32 v10 идет help так вот там есть файлик "asmintro.chm" а в этом файлике есть раздел "Register Preservation Convention".
    Так вот там и написано, зачем их нужно сохранять.