выравнивание стэка на 16 байт (нужно или нет?)

Тема в разделе "WASM.X64", создана пользователем ratix, 17 окт 2007.

  1. ratix

    ratix New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2005
    Сообщения:
    52
    Адрес:
    Kyrgyzstan
    везде в доках по х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", то все точно также прекрасно работает..

    почему?
    Действительно ли безопасно так поступать?
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    где такое написано?
     
  3. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    ratix
    Лучше выравнивай. Известны случаи, когда невыровненный стек приводил к падениям кода, содержащего SSE инструкции. Вот, заодно в качестве теста можешь проверить, будет ли твой код, если его разбавить SSE, падать при невыровненном стеке...
     
  4. Songoku

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    ОЧЕНЬ ОЧЕНЬ НУЖНО!!! В своё время я с этим говно помучался ...
     
  5. ratix

    ratix New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2005
    Сообщения:
    52
    Адрес:
    Kyrgyzstan
    Songoku
    а какие проблемы были при невыравненном стэке?

    flankerx
    SSE пользовать ещё не проверял, надо попробовать
     
  6. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Никаких проблем кроме эксепшена не было :)
     
  7. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    ты суслика видишь ? а он есть...
     
  8. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Вот как раз для этого и нужно выравнивание стека на границу 16-ти байт.
     
  9. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Под ВинХР (32) на невыровненном стеке сокеты у меня не работали ;)
     
  10. ratix

    ratix New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2005
    Сообщения:
    52
    Адрес:
    Kyrgyzstan
    _Serega_
    причем здесь х32 ось? разве в х32 нужно выравнивать стэк с гранулярностью больше DOWRD'а (32 бита)?

    речь идет о х64 long mode.. было бы логично выравнивание стэка на 64 бита (QWORD), но в доках требуется выравнивание на 128 бит (10h byte или DQWORD).

    в тоже время - на моем опыте - выравнивание не на 16 байт, а только на 8 не приводит ни к каким неприятностям (по крайней мере пока)..
     
  11. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    ratix
    с чего ты взял, что должны быть какие-то проблемы
    CPU сам выравнивает стек до передачи управления обработчику
    выравнивание в принципе необходимо для того, чтобы
     
  12. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    х32 не причем. Я это к тому, что суслики появляются там, где их совсем не ждешь... Просто запарился в свое время с отладкой и поэтому тема задела за живое.
     
  13. ratix

    ratix New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2005
    Сообщения:
    52
    Адрес:
    Kyrgyzstan
    rei3er
    значит, получается, выравнивать совсем не обязательно (все будет работать), а просто желательно - для оптимизации скорочти, так?
     
  14. intel

    intel New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    8
    Адрес:
    Russia
    еще зависит от процессора, некоторым на невыровненную загрузку памяти в SSE2 регистры наплевать, тормозно будет раз в 5, но exceptions не будет, несмотря на то, что у Intel указано в мануалах.