передача параметров в функцию

Тема в разделе "WASM.BEGINNERS", создана пользователем _evil, 26 сен 2018.

  1. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    61
    помогите разобраться с майкрософтовским компилятором - не могу понять как он код генерирует
    Код (Text):
    1.  
    2. ;int __stdcall Summ(int a,int b){
    3. 00AB13C0  push        ebp             ;сохраняет регистр в стеке
    4. 00AB13C1  mov         ebp,esp       ;сохраняет указатель стека в регистре
    5. 00AB13C3  sub         esp,0CCh     ; для чего меняет вершину стека?
    6. 00AB13C9  push        ebx              ;\
    7. 00AB13CA  push        esi               ; >сохраняет регистры в новом стеке
    8. 00AB13CB  push        edi              ;/
    9. 00AB13CC  lea         edi,[ebp-0CCh] ; далее хитрые манипуляции которые я не понимаю
    10. 00AB13D2  mov         ecx,33h
    11. 00AB13D7  mov         eax,0CCCCCCCCh
    12. 00AB13DC  rep stos    dword ptr es:[edi]
    13.    ; int c=a+b;
    14. 00AB13DE  mov         eax,dword ptr [a] ; \
    15. 00AB13E1  add         eax,dword ptr [b]   ;   >всё вроде хорошо только как он вычислил адреса
    16. 00AB13E4  mov         dword ptr [c],eax ;  /
    17.    ; return c;
    18. 00AB13E7  mov         eax,dword ptr [c]
    19. ;}
    20. 00AB13EA  pop         edi ;  \
    21. 00AB13EB  pop         esi ;    > восстановление регистров из нового стека
    22. 00AB13EC  pop         ebx ; /
    23. 00AB13ED  mov         esp,ebp ;восстановление стека
    24. 00AB13EF  pop         ebp         ;восстановление регистра
    25. 00AB13F0  ret         8               ;возврат и уменьшение стека на 2*4 байта
    26.  
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    push ebp
    mov ebp,esp
    sub esp,<>
    это стандартный пролог функции, в ebp сохраняется указатель стека и по нему адресуются аргументы (ebp + <>) и локальные переменные (ebp - <>). Размер локальных переменных и есть 0CCh, под которые инструкцией sub резервируется место. У тебя видимо по отладочной информации локальные переменные сами подставились, если это недоразумени убрать там будет mov [ebp - <>],<>, и соответственно, адреса локальных были вычислены при компиляции.
    rep stosd заполняет поле по указателю edi количеством ecx данных eax.
    За каким смыслом майкрософтовский компилятор в эпилоге функции не использовал инструкцию leave вместо mov esp,ebp; pop ebp надо у майкрософт спрашивать.
     
    Последнее редактирование: 26 сен 2018
    _evil нравится это.
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    _evil,

    Хороший и годный подход, возникла куча вопросов. Вы должны сами разобраться, изучить предмет и найти ответы. Мой вам совет - не слушайте никого, а используйте системную документацию. Вы просто не понимаете как это всё устроено, но а опираться на какие то мнения - глупо, это навредит. Ответивший выше вам человек - глупый школьник, который знает немного набор инструкций и может по этой причине что то бредовое отвечать.

    Разбираться в этом если интересно нужно самому, зачем спрашивать базовую инфу.
     
  4. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    61
    переключил в release и применил нормальный дизасемблер
    push ebp
    mov ebp,esp
    push ecx
    mov eax,[ebp+08h]
    add eax,[ebp+0Ch]
    mov [ebp-04h],eax
    mov eax,[ebp-04h]
    mov esp,ebp
    pop ebp
    retn 0008h
    стало всё понятно ...