везде в доках по х64 написано, что перед очередным вызовом (call) стэк должен быть выровнен на 16 байт.. иначе - плохо (крэш).. почему я такого не наблюдаю? простейший пример: proc SomeProc sub rsp,8*5 mov r9d,0 lea r8,[_caption] lea rdx,[_message] mov rcx,0 call [MessageBoxA] endp этот пример корректный - "sub rsp, 8*5" выравнивает стэк на 16 байт. но если заменить на "sub rsp, 8*4", то все точно также прекрасно работает.. почему? Действительно ли безопасно так поступать?
ratix Лучше выравнивай. Известны случаи, когда невыровненный стек приводил к падениям кода, содержащего SSE инструкции. Вот, заодно в качестве теста можешь проверить, будет ли твой код, если его разбавить SSE, падать при невыровненном стеке...
Songoku а какие проблемы были при невыравненном стэке? flankerx SSE пользовать ещё не проверял, надо попробовать
_Serega_ причем здесь х32 ось? разве в х32 нужно выравнивать стэк с гранулярностью больше DOWRD'а (32 бита)? речь идет о х64 long mode.. было бы логично выравнивание стэка на 64 бита (QWORD), но в доках требуется выравнивание на 128 бит (10h byte или DQWORD). в тоже время - на моем опыте - выравнивание не на 16 байт, а только на 8 не приводит ни к каким неприятностям (по крайней мере пока)..
ratix с чего ты взял, что должны быть какие-то проблемы CPU сам выравнивает стек до передачи управления обработчику выравнивание в принципе необходимо для того, чтобы
х32 не причем. Я это к тому, что суслики появляются там, где их совсем не ждешь... Просто запарился в свое время с отладкой и поэтому тема задела за живое.
rei3er значит, получается, выравнивать совсем не обязательно (все будет работать), а просто желательно - для оптимизации скорочти, так?
еще зависит от процессора, некоторым на невыровненную загрузку памяти в SSE2 регистры наплевать, тормозно будет раз в 5, но exceptions не будет, несмотря на то, что у Intel указано в мануалах.