Как происходит резервирование места в стеке?

Тема в разделе "WASM.ASSEMBLER", создана пользователем 123dragon, 17 янв 2005.

  1. 123dragon

    123dragon New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2005
    Сообщения:
    46
    Адрес:
    Russia
    Подскажите.

    Как происходит резервирование места в стеке и обращение к локальным переменам?



    Заранее благодарен.
     
  2. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    Код (Text):
    1.  
    2. push ebp
    3. mov ebp,esp
    4. add esp,<размер стекового кадра>
    5. ;код, обращение к переменным как [ebp+n]
    6. mov esp,ebp
    7. pop ebp
    8.  


    легче использовать enter и leave, они выполняют теже самые действия, но работают дольше
     
  3. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Странно...

    Компилятор Visual C++ генерирует "sub esp, ..." и "[ebp-n]" как метод доступа.



    К слову: а можно использовать "[esp+n]"?
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    AsmGuru62



    Конечно, но адресация получается на 1 байт длиннее.
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Turkish

    > "add esp,<размер стекового кадра>"

    > "обращение к переменным как [ebp+n]"




    Повнимательнее, батенька, надо быть, а то научишь...

    Конечно sub esp,X и [ebp-n] - стек всегда "растет вниз"



    AsmGuru62

    > "а можно использовать "[esp+n]"?"

    Обидели ESP: все прочие [reg+n] кодируются байтом ModRM, а бедному ESP места не хватило, его в SIB-байт затолкали. Вот и получается на байт длиннее, да еще и дополнительная микрооперация вычисления адреса при mov m,r на PIV.
     
  6. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    leo А кто скзал, что к ESP нельзя прибавить отрицательно число ?
    Код (Text):
    1. push        ebp
    2. mov         ebp,esp
    3. add         esp,-010 ; Место под 4 DWORD


    Это код из HIEW
     
  7. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    AsmGuru62 >




    Конечно можно, тот же MSVC это делает (/Oy, но /O1s этому может помешать), а intel C++ тем более.

    Это оптимизация по скорости (меньше операций), помимо этого лишний регистр свобождается.





    leo >




    Не важно, куда растёт стэк. MSVC при оптимизации по размеру способен установить ebp "в серидину" локальных переменных, и часть из них адресовать с использованием положительного смещения, а часть - отрицательного. Это позволяет использовать однобайтные смещения вместо 4х байтных.
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    SteelRat & S_T_A_S_

    Все правильно. Мое замечание целиком относилось к коду приведенному Turkish, а вариации на тему "а еще и так можно" я приберег для вас :)
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    SteelRat имеет ввиду, что прибавляя отрицательное, мы тем самым вычитаем положительное ;)
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    S_T_A_S_

    Это ты кому объясняешь ?



    ИМХО, судя по первоначальному вопросу, парню азы и суть дела нужно объяснить, а не парить мозги тонкостями. Тонкости конечно нужны и важны, но лучше бы их изложить в систематическом виде в FAQ, аль еще где. Может возьмешся ? :)
     
  11. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138
    Азы можно почитать, например, здесь:

    http://reversing.net/articles/012/IdentFnc.html

    "Идентификация функций, аргументов и переменных"

    (перевод "Identifying Function, Arguments, and Variables" by Rhayader)

    Статья старая, но с того времени мало что изменилось... ;о)
     
  12. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    Анука идентифицируйте :) за 32 байта запускаем notepad без единого push'а и вообще без стека (если так можно выразится)
    Код (Text):
    1. ;===============================================================
    2. format      PE      gui 4.0
    3. include     '%fasminc%\win32a.inc'
    4. ;===============================================================
    5. buffer      rb      4096*2
    6. params      dd      sinfo
    7.             dd      buffer,255
    8.             dd      target,0,0,0,0,0,0,0,sinfo,pinfo
    9. sinfo       STARTUPINFO
    10. pinfo       PROCESS_INFORMATION
    11. target      db      'notepad.exe',0
    12. ;===============================================================
    13. entry       $
    14.             mov     esi,params
    15.             mov     edi,GetStartupInfo
    16.             xchg    esi,esp
    17.             call    dword [edi]
    18.             call    [edi+GetSystemDirectory-GetStartupInfo]
    19.             sub     esp,8
    20.             call    [edi+SetCurrentDirectory-GetStartupInfo]
    21.             add     esp,4
    22.             call    [edi+CreateProcess-GetStartupInfo]
    23.             xchg    esi,esp
    24.             ret
    25. ;===============================================================
    26. data        import
    27. library     kernel32,'kernel32.dll'
    28. include     '%fasminc%\apia\kernel32.inc'
    29. end         data
    30. ;===============================================================
     
  13. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138
    bogrus



    У меня как-то с трудом ассоциируется подобный пример со словом "азы" ;о), это уже, пожалуй, ближе к "фигуре высшего пилотажа". Но "нет таких крепостей, которых не могли бы взять..." :о), предварительно поупражнявшись в азах.
     
  14. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    leo >




    Это и есть самые азы, адресации вида [ebp-n] процессор не знает, смещение всегда прибавляется, т.е. [ebp+n]. Другое дело, что мы имеем дело с арифметикой по модулю 2<sup>32</sup>, и если n > 80000000h, то говорим об "отрицательных" смещениях.
     
  15. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Из всего сказанного: [esp+n] длиннее на 1 байт, но быстрее.
     
  16. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    сама команда длиннее, но вся функция может получиться даже меньше по размеру, т.к пролог/эпилог может совсем отсутствовать.
     
  17. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Пролог + эпилог занимают 4 байта, так что если адресаций меньше 4х, то есть смысл использовать esp, что и делает VC++.
     
  18. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Пролог/эпилог нужен всё равно. А иначе где хранить ESP от предыдущей функции?
     
  19. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    AsmGuru62

    Вы что-то путаете. Зачем хранить ESP?
     
  20. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Ну бывает регистров не хватает... вот например, только что написАл

    (правда пролога и эпилога совсем нет)
    Код (Text):
    1.  
    2. 00401850  /$  60            pushad
    3. 00401851  |.  B8 78B64A00   mov     eax, 004AB678
    4. 00401856  |.  8960 04       mov     [eax+4], esp
    5. 00401859  |.  8328 04       sub     [dword eax], 4
    6. 0040185C  |.  BE A8534100   mov     esi, 004153A8
    7. 00401861  |.  BD E0010000   mov     ebp, 1E0
    8. 00401866  |.  8BE2          mov     esp, edx                        
    9. ........
    10. 004018C0  |.  8B25 7CB64A00 mov     esp, [4AB67C]
    11. 004018C6  |.  61            popad
    12. 004018C7  \.  C3            retn
    13.