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

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

  1. elestrago

    elestrago New Member

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

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

    Clerk Забанен

    Публикаций:
    0
    Для начала следует узнать зачем вобще регистры и что это такое, дальнейшие вопросы отпадут сами собой.
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    elestrago
    Тебе надо прочитать про форматы передачи параметров в процедуры.
     
  4. elestrago

    elestrago New Member

    Публикаций:
    0
    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
    http://en.wikipedia.org/wiki/X86_calling_conventions
     
  6. Clerk

    Clerk Забанен

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

    elestrago New Member

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

    splinter New Member

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

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


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

    Swat2k Дима

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

    Y_Mur Active Member

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

    AsmGuru62 Member

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

    S_Alex Alex

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