Соглашения о вызовах и masm64

Тема в разделе "WASM.BEGINNERS", создана пользователем Victor_S, 2 ноя 2011.

  1. Victor_S

    Victor_S New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    28
    Недавно начал создавать dll на масме64 для си++. Почитал на http://msdn.microsoft.com/ru-ru/library/ms235286.aspx соглашение о вызовах в x64, и оказывается, соглашение только одно - fastcall. Написал вот такой код:
    Код (Text):
    1. option casemap:none
    2.  
    3. .code
    4.  
    5. dllMain proc hinstDLL:qword, fdwReason:dword, lpvReserved:qword
    6.     mov rax,1
    7.     ret
    8. dllMain endp
    9.  
    10. memCpy64 proc a:qword, b:qword, c:qword, d:qword, e:qword
    11.     mov rax,a
    12.     mov rbx,b
    13.     ret
    14. memCpy64 endp
    15.  
    16. end
    , запустил Visual Studio с программой, использующей эту dll. И вот что обнаружил:
    1. mov rax,a почему-то берёт "а" из стека, а не из регистра rcx, естественно, в rax загружается мусор.
    2. ret не освобождает стек, а при соглашении fastcall стек должна освобождать вызываемая подпрограмма.
    Ну с параметрами всё просто, я могу написать mov rax,rcx, а вот со стеком у меня возник вопрос: "Должен ли я вручную освобождать стек, т. е. писать ret XX?"
    Но, может быть чтобы вышеописанных ошибок не происходило, я должен что-то дописать, например "proc fastcall" или ещё что-то?
     
  2. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    В msdn все хорошо написано. 1 и 2 правильно. "proc fastcall" писать не нужно.
     
  3. Victor_S

    Victor_S New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    28
    В смысле правильно? 1. По идее а нужно брать из регистра а процедура берёт из стека, разве правильно? 2. Разве правильно, что стек не освобождается?
     
  4. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    1. a передаётся в rcx но место в стэке под неё все равно зарезервировано.
    2. Правильно.

    Функции условно деляться на два типа ветви (вызывают WINAPI функции) и листья (не вызывают WINAPI функции). С ml64 по нормальному можно писать только листья. Для написания ветвей уже нужны макросы.
     
  5. Victor_S

    Victor_S New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    28
    Но тогда получается, что в x64 используется не соглашение в вызовах fastcall, а что-то среднее между fastcall(парамерты через регистры) cdecl(стек очищает вызывающая программа). А в msdn написано, что fastcall. В msdn ошибка?
     
  6. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Просто решили так назвать. Описание там исчерпывающее и при правильном понимании путаницы не должно быть.
     
  7. Victor_S

    Victor_S New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    28
    Спасибо за помощь.