Перед вызовом СОБСТВЕННОЙ ф-ии делаю sub rsp, 40 как и написано во всех учебниках, стек после сохранения адреса возврата и создание фрейма(push rbp) получается 8FEF0 или 589552 что кратно 16, тут вроде бы все норм, идем дальше.
В своей ф-ии вызываю winapi перед эти сделав sub rsp, 40
Тоесть все по правилам fastcall x64, винапи падает с обращение к недоступной памяти, если же перед вызовом winapi резервирую стек только для 4х параметров без выравнивания, тоесть делаю sub rsp, 8*4
отрабатывает все штатно. Почему так ? В самой winapi вижу в начале
mov [rsp+8], rbx
mov [rsp+10h], rbp
mov [rsp+18h], rsi
push rdi
sub rsp, 20h
сохранения регистров и sub rsp, 20h ? это что резервирование места для теневых регистров ? но ведь по правилам fastcall win 64 это должен делать вызывающий ? Отсюда в итоге и получается кривой стек
после
sub rsp, 5*8
call some_winapi
стек получается 8FE98h или 589464 ÷ 16 = 36841.5
как так, объясните пожалуйста где ошибка в моих рассуждениях?