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