Какие регистры меняет WinAPI функция?

Тема в разделе "WASM.WIN32", создана пользователем sysexit, 30 сен 2010.

  1. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Где-то есть таблицы? Или все нужно делать самому?

    Понятно, что может поменять любые кроме ESP, EBP, EDI, ESI.
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    чаще всего меняет все ибо как правило эти функции достаточно сложны и глупо недоиспользовать регистры, просто ESP, EBP, EDI, ESI при выходе восстанавливаются.
    И что значит "таблицы? Или все нужно делать самому?" даже если какая-то из апи случайно не изменяет какой-то из регистров то пользоваться этим очень нежелательно т.к. эта фича может неожиданно исчезнуть :))
     
  3. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Например в стандартном Windows блокноте, используется, такой код:

    Код (Text):
    1.  PUSH EBX
    2.  PUSH EDI
    3.  PUSH DWORD PTR SS:[EBP+8]
    4.  CALL DWORD PTR DS:[<&USER32.SetDlgItemTextW>] ; USER32.SetDlgItemTextW
    Выше этого кода вызывается USER32.SendDlgItemMessageW. И после нее регистр EBX используется как параметр следующей API. Причем EBX увеличивается в цикле.

    Код (Text):
    1.         MOV ESI,DWORD PTR DS:[<&USER32.SendDlgItemMessageW>] ; USER32.SendDlgItemMessageW
    2.         PUSH EBX
    3.         PUSH 01Eh
    4.         POP EDI
    5.         MOV EBX,0100A3E0h
    6.  
    7. @NOTEPAD_01005F9F:
    8.  
    9.         PUSH 0
    10.         PUSH 027h
    11.         PUSH 0C5h
    12.         PUSH EDI
    13.         PUSH DWORD PTR SS:[EBP+8]
    14.         CALL ESI
    15.         PUSH EBX
    16.         PUSH EDI
    17.         PUSH DWORD PTR SS:[EBP+8]
    18.         CALL DWORD PTR DS:[<&USER32.SetDlgItemTextW>] ; USER32.SetDlgItemTextW
    19.         ADD EBX,050h
    20.         INC EDI
    21.         CMP EBX,0100A430h
    22.         JLE @NOTEPAD_01005F9F
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ebx, df.
     
  5. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Можно чуть более многословнее повторить?
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    sysexit
    да EBX тоже документированно сохраняется как и ESP, EBP, EDI, ESI.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
  8. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    можно погуглить на типа _stdcall ...........
     
  9. Mentor

    Mentor New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2010
    Сообщения:
    67
    Неожиданно сам споткнулся на этой теме хотя считал что знаю о stdcall больше чем нужно

    http://www.scalprum.eu/cdecl_and_stdcall_calling_conventions.html
    Регистры EAX, ECX, и EDX доступны для использования в вызываемой функции
    Регистры EBX, ESI, EDI, и EBP не должны менять вызываемой функцией (если меняются, должны быть восстановлены)