Безопасный вызов функций WinAPI (сохранение значений регистров)

Тема в разделе "WASM.BEGINNERS", создана пользователем andy_tallinn, 11 мар 2007.

  1. Pyromaniac

    Pyromaniac New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    9
    Если мало регистров, пиши под х64... Не знаю, как там у интел, но у амд В 64 битном режиме восемь (вроде) дополнительных регистров общего назначения. Кстати, в виндовзх64 почти все вызовы апи функций реализованы как фасткалл как раз с использованием этих новых регистров. В стек параметры помещаются только в том случае, если их больше 4. И только те, которые в эти 4 не входят...
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Наверное и в Win32 API реализованы как fastcall, поэтому и нет нужды заботится о сохранении ecx и edx в них параметры передают, а в eax возвращается результат. Кстати кроме ebx, esi и edi, сохраняется еще и ebp
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Нет.
     
  4. Cock

    Cock New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    148
    Наверное опыта мало и много самомнения. И есть презрение ко всему незнакомому и нежелание разбираться с ним. Так же вы разбираетесь и с unix-подобными темами (это мое предположение)

    А между 64 битными АМД и интел есть некоторые различия, стоит их уяснить.
     
  5. andy_tallinn

    andy_tallinn Andy Tallinn

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    13
    Адрес:
    World
    Cock
    Может быть. Я не понимаю о чем (или о ком) именно речь.

    Жаль, что данная фраза ни к кому не адресована. В любом случае, она —
    лишь Ваше предположение и, как любая другая точка зрения, имеет право
    на существование.

    Pyromaniac
    Увы, не всегда это возможно.
     
  6. Pyromaniac

    Pyromaniac New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    9
    Действительно, непонятно в чей огород этот камень... А то, что это реализация амд, а не интел, я и так написал, читайте внимательней.

    2andy_tallinn: да это не всегда возможно, просто вспомнилось (вдруг пригодится)...
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Mikl__
    Пример маленькой функции:
    KERNEL32!lstrlenA
    Код (Text):
    1. .text:7C80BDB6 ; int __stdcall lstrlenA(LPCSTR lpString)
    2. .text:7C80BDB6                 public lstrlenA
    3. .text:7C80BDB6 lstrlenA        proc near
    4. .text:7C80BDB6 lpString        = dword ptr  4
    5. .text:7C80BDB6                 push    8               ; lstrlen
    6. .text:7C80BDB8                 push    offset dword_7C80BDF0
    7. .text:7C80BDBD                 call    sub_7C8024C6
    8. .text:7C80BDC2                 mov     eax, [ebp+8]
    9. .text:7C80BDC5                 test    eax, eax
    10. .text:7C80BDC7                 jz      loc_7C836635
    11. .text:7C80BDCD                 and     dword ptr [ebp-4], 0
    12. .text:7C80BDD1                 lea     edx, [eax+1]
    13. .text:7C80BDD4 loc_7C80BDD4:
    14. .text:7C80BDD4                 mov     cl, [eax]
    15. .text:7C80BDD6                 inc     eax
    16. .text:7C80BDD7                 test    cl, cl
    17. .text:7C80BDD9                 jnz     short loc_7C80BDD4
    18. .text:7C80BDDB                 sub     eax, edx
    19. .text:7C80BDDD                 or      dword ptr [ebp-4], 0FFFFFFFFh
    20. .text:7C80BDE1 loc_7C80BDE1:
    21. .text:7C80BDE1                 call    sub_7C802501
    22. .text:7C80BDE6                 retn    4
    23. .text:7C80BDE6 lstrlenA        endp
    В данном случае имело смысл задействовать fastcall.

    АПИ реализовано на 99% как stdcall и лишь несколько функций cdecl (USER32!wsprintfA/W, ODBC32!MpHeapAlloc и т.д.)
     
  8. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Pyromaniac
    насколько я знаю в Win64 (да и в *nix64) пытаются унифицировать соглашения вызова, так что fastcall'ом это вроде уже и не назовешь... это вроде официально называется Microsoft x64 calling conventions.

    Cock
    Это какие? Я пока знаю только одно, весьма несущественное. (Если под "интел" не имеется ввиду IA-64 :) )
     
  9. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon