аналог листинга asm->c

Тема в разделе "WASM.BEGINNERS", создана пользователем Clyde, 30 мар 2009.

  1. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    Всем привет
    Недавно наткнулся на следующий код:
    вот это смущает
    Не подскажет ли кто нибудь как это будет выглядеть на си?
    Тоесть мне интересна конструкция (или директива), используя которую автор
    сделал подобный маневр. Или же он так ручками? %)
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Clyde
    Это не авторский "манёвр", а компилятора. Стандартный пролог процедуры плюс обычное выравнивание стека на восьмибайтовую границу (AND ESP,FFFFFFF8) и выделение памяти для локальных переменных (SUB ESP,5C). Зачем именно там выравнивание, может зависеть от дальнейших действий.
     
  3. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Это компилер выдал - stack frame. Округление и резервирование.
     
  4. maverick

    maverick New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2008
    Сообщения:
    148
    [deleted]
     
  5. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    С резервированием все ясно, не понятно с какой целью выравнивать стек...
    Где об этом можно прочесть?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Тут http://wasm.ru/forum/viewtopic.php?id=31053&p=1
     
  7. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    большое всем спасибо, тему можно закрыть
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Clerk
    А... там разве шла речь, о том, в каких случаях должно быть выравнивание именно на восемь байт? Про четырёхбайтное и так ясно, но смысла делать его специально нет, т.к. при входе в процедуру подразумевается, что стек уже выравнен на четыре байта.
    Clyde
    На восемь байт выравнивание может потребоваться, например, в качестве повышения производительности, если в локальных переменных хранятся числа с плавающей запятой, а процедура работает с FPU.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    l_inc
    А.. это выравнивание вручную поставлено и оно нужно ?
    Вроде ты сказал что это компилятор сделал.. И почему именно 8, может мне понадобится на границу страницы стек выравнить, например для манипуляций с атрибутами его страницы.
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Clerk
    Я так решил чисто исходя из содержимого первого поста. :) Т.е. вероятно, топикстартер рассматривал чужой код под Olly, предварительно проверив каким-нибудь peid, чем был скомпилирован код.
    Эм... ну потому что AND ESP,FFFFFFF8 выравнивает именно на восемь байт. :) А для чего это сделано, я ж написал, что без знания дальнейших действий в процедуре, трудно сказать (пост 2, предложение 3).
    Ну и скорее всего автор решил закрыть тему раньше, чем понял, что не получил ответ на свой вопрос, поэтому я поторопился в посте 8 сделать предположение о том, что, возможно, процедура работает с FPU. :)
     
  11. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    l_inc
    нет, там не FPU...
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Clyde
    Покажи всю процедуру.
     
  13. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Как вариант - в процедуре может использоваться MMX, SSE, SSE2 и т.д.
    Они требуют выравнивания операндов, для MMX как раз 8 байт выравнивание надо.
    В противном случае в зависимости от команды будет либо штраф в плане производительности, либо вообще исключение.
    Гадать можно долго...