ESP vs EBP. Выбор базы для адресации.

Тема в разделе "WASM.ASSEMBLER", создана пользователем Serg50, 24 фев 2010.

  1. Serg50

    Serg50 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2010
    Сообщения:
    48
    Для адресации к аргументам и локальным наиболее часто используюся классический способ через EBP, и более запутанный через ESP. Сам использовал оба, однако просмативая код задумался: а какие преимущества дает последний способ? Комманды зачастую получаются длиннее на байт, и не уверен что быстрее. Лишний регистр? А если он не особо и нужен? В общем встречал ли кто-нибудь обсужение данного вопроса - я что-то не смог найти по поиску.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Никаких, только недостатки - на лету сложно вачитывать смещения переменных, ибо стек сдвигается, отсутствует обратная связь между процедурами(бактрейс проблемно выполнить).
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    как раз это плюс для релиза :)
    валится прога у клиента? тогда скидываем дебаг без стековых фреймов и бектрейсом смотрим.
    Зато в релизе всяких гадостей можно не опасаться, типа раскрутки стеком каким-еибудь зловредом.

    Студия с некоторых пор юзает адресацию через esp, думаю в плане оптимизации это более предпочтительно чемстековые фреймы.
     
  4. seniour_juggler

    seniour_juggler Member

    Публикаций:
    0
    Регистрация:
    27 дек 2009
    Сообщения:
    35
    Clerk
    Не был бы настолько категоричным - компилятору, по большому счету, все равно, как происходит адресация к стеку. Там есть и посложнее задачи. Зато связка (push ebp - mov ebp, esp ... mov esp, ebp - pop ebp) что-то весит, во-первых. Зачем реверсеру работу облегчать, во-вторых. Лишний регистр далеко не всегда лишним оказывается, в-третьих. Ну, а в линуксе, есть red zone, где можно [esp-x] адресоваться, что исключает необходимость в sub esp, n в ряде случаев, в-четвертых.
     
  5. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Преимущество - экономия трёх или четырёх команд в зависимости от пролога/эпилога:
    Код (Text):
    1. push ebp/mov ebp,esp/pop ebp
    либо
    Код (Text):
    1. push ebp/mov ebp,esp/mov esp,ebp/pop ebp
    Для процедур с небольшим количеством локальных переменных изменения esp проследить не трудно.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    cppasm
    Тогда как недостаток - инструкция использующая для адресации регистр Esp длинее на 1 байт, чем Ebp. Тогда если 10 раз используется адресация локальных переменных, это удлиняет код на 10 байт:
    Код (Text):
    1. 8B 45 04    mov eax,dword ptr ss:[ebp+4]
    2. 8B 44 24 04 mov eax,dword ptr ss:[esp+4]
    n0name
    Зловред юзает системный функционал, а не ваше приложение, раскручивая стековые фреймы. Кстате с сех проблемы не возникнут при этом ?
     
  7. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    По скорости разницы нет, по объёму памяти использование ESP обычно несколько хуже, зато свободен ещё один регистр (EBP) -- а их в ИА-32 отнюдь не море разливанное. Так что в итоге предпочтительней, скорей всего, будет адресация относительно ESP.
     
  8. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    выбор за вами
    гемор для разработчика если на асме пишите и гемор для реверсера с наслазждением использования свободноего ebp- esp
    в противном случае ebp
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    для реверсеров абсолютно никакого геморра нет, ИДА вполне удачно распознает переменные и аргументы.
     
  10. Serg50

    Serg50 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2010
    Сообщения:
    48
    Это точно :) Я ее иногда использую для проверки не накосячил ли со сдвигами.

    Вообще складывается впечатление, что если процедура много и счассливо работает с аргументами и локальными, стоит использовать EBP, а ESP для мелких, или мало использующих процедур. ESP в принципе можно подмешивать, например в последнее время часто делаю циклы вида:
    Код (Text):
    1.     push    counter
    2. @@:
    3.     ....
    4.     dec      DWORD PTR [esp]
    5.     jnz       @B
    6.               add      esp, 4 ; или  pop  eax
    Собственно тему то я поднял, потому что как то до этого не обращал внимания, что команды с ним длиннее :)
     
  11. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Недавно работал с выделением стековых фреймов и тоже задумался, зачем нужен ebp когда мона адресовать с вершины ESP? А еще у меня была одна процедура, которую вызывали две разные нити, и я по неопытности подумал, не может ли быть конфликтов, тело функции одно, но наверно у разной нити свой фрейм получается?

    В общем видимо в ряде осей использовать ESP небезопасно, возможно его изменение какимнить прерыванием дос, тада EBP надежней в плане устойчивости, так это?
     
  12. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Зачем вообще в архитектуру ввели EBP, когда все можно адресовать от ESP в минус и компилятору абсолютно пофиг какой код генерить? какие траблы и ограничения могут встретится при адресации фрейма от ESP?
     
  13. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    В 16битном режиме не было адресации относительно sp. Когда пишешь на ассемблере, использовать esp сложнее, чем ebp, т.к. esp более "подвижен" и считать в голове приходится больше. Ну и как уже сказали, инструкция с esp длиннее на один байт из-за байта SIB, без которого адресация esp невозможна.
     
  14. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Дошло до меня наконец, что при отсчете от ESP нельзя будет стек юзать, от одного только push всем локальным переменным пипец прийдет =)))
     
  15. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Вернее их относительные смещения изменятся, это тяжело будет отслеживать.
     
  16. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Не прийдёт - просто надо корректировать смещение после каждого push/pop.

    Но как ты уже сказал
    Поэтому я тоже не понимаю зачем эти кадры стека да ещё и инструкции ENTER/LEAVE.
     
  17. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    кста, от ebp массивчики с 1 получаются, а от esp c нуля, что для си и асма привычнее. Так?
     
  18. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Не понял почему? Ведь типичная функция выглядит так:
    Код (Text):
    1. push ebp
    2. mov  ebp,esp
    3. sub  esp,xx ;размер массива
    4.  
    5. -//-
    6.  
    7. mov  esp,ebp
    8. pop  ebp
    Тогда первый элемент массива будет в [ebp-xx].
     
  19. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Это я туплю, опыта маловато...
    Я решил, что к байтам нужно будет адресоваться как [ebp-1], [ebp-2]...
    Но в натуре это конечно как вы справедливо заметили [ebp-xx+0], [ebp-xx+1]...
     
  20. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Если возникнет потом задача юзать фрейм то выходит что через ebp не короче будет?

    Через ESP достаточно
    [esp+ecx], где ecx номер байтовой ячейки

    А через EBP нужно будет в команде смещение указывать, выходит?
    [ebp+ecx-SIZE]

    А при отсчете как я сначала предложил сверху вниз ващще
    neg ecx
    [ebp+ecx-1]

    про опкоды судить не берусь, скока нужно быйт чтобы закодить -1, один или четыре?