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

Тема в разделе "WASM.X64", создана пользователем 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. jorikh

    jorikh New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2011
    Сообщения:
    31
    1) асм обычно вставляет в начало каждой функции код, сохраняющий параметры в стек, который был выделен _вызывающей_ функцией. всё потому как ты регистр rcx можешь сто раз изменить перед обращением к параметру и использовать его после этого для передачи параметра нельзя.
    2) стек освобождает вызывающий код.

    у меня всё работает и без proc fastcall.
     
  3. Victor_S

    Victor_S New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    28
    Спасибо, конечно. Но к этому времени я уже вроде разобрался...