меня есть код, который вызывает WinAPI функцию MessageBoxA.
Перед её вызовом я выделяю 32 байта (shadow storage), вызываю её, и возращаю в стек обратно 32 байта.
Вот так у меня получилось:
sub rsp, 32
call MessageBoxA
add rsp, 32
Компилирую, компаную, запускаю - не работает. Покопавшись в инете, увидел, что чел выделяет не 32 байта, а 40. Делаю то же самое, но выделяю 40 байт, и программа работает.
Можете обьяснить, почему нужно выделять 40 байт, а не 32 байта? У этой функции параметров меньше пяти, значит нет аргументов, которые в стек надо засовывать
В том ресурсе обьяснялось так: 32 байта теневого хранилища + 8 байт для выравнивания. Вот только зачем это выравнивание?
Насколько помню, для некоторых инструкций с xmm-регистрами адреса должны выравниваться по границе 16 байт(это более быстрые инструкции, чем те, которые выравнивания не требуют) и вот как раз для них надо выравнивать стек по границе 16 байт
А как тут сопоставляется 40 байт и выравнивание по 16-байтной границе?
Обсуждают сегодня