MASM32 - Call внутри процедуры

Discussion in 'WASM.BEGINNERS' started by OFFSIDE, Oct 25, 2008.

  1. OFFSIDE

    OFFSIDE New Member

    Blog Posts:
    0
    Joined:
    Sep 23, 2006
    Messages:
    106
    Приблизительный код:
    Code (Text):
    1. ABCF proc
    2. LOCAL buff [1024]:byte
    3. ;Начало кода, ничего интересного
    4.  
    5. ......
    6. call sendd
    7. ......
    8. call sendd
    9. ......
    10. call sendd
    11. ......
    12. invoke CallingProc,....                                              
    13. test ebx,ebx
    14. jz metka
    15.  
    16. quit:
    17. xor eax,eax
    18. ret
    19.  
    20. sendd:
    21. mov esi,[esp]
    22. invoke send,s,addr buff,sizeof buff
    23. jmp esi
    24.  
    25. ABCF endp
    Вопрос в следующем: нужно ли выравнивать стек при таком локальном вызове? Ведь в стек ложится адрес возврата... просто вытолкнуть его pop? Или нет необходимости?
     
  2. twgt

    twgt New Member

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    1,494
    del
     
  3. q_q

    q_q New Member

    Blog Posts:
    0
    Joined:
    Oct 5, 2003
    Messages:
    1,706
    twgt
    ret
    Обрати внимание, что sendd: ... jmp esi внутри ABCF proc ... ABCF endp, которая в свою очередь содержит LOCAL buff [1024]:byte, что означает, что в ней присутствует невидимый пролог и эпилог.

    OFFSIDE
    нужно ли выравнивать стек
    В показанном тобой коде - необязательно.

    ps afaik у send'а четыре параметра.
     
  4. twgt

    twgt New Member

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    1,494
    q_q
    Действительно. В таком случае можно сделать так:
    Code (Text):
    1. sendd:
    2. pop eax
    3. push 0
    4. push sizeof buff
    5. push addr buff
    6. push s
    7. push eax
    8. jmp send
    Тогда по идее ret из send'а должен вернуться после call sendd. Не так ли?!
     
  5. q_q

    q_q New Member

    Blog Posts:
    0
    Joined:
    Oct 5, 2003
    Messages:
    1,706
    twgt
    Поправь сам. Hint что будет первым параметром send'а?

    можно сделать так
    Зачем? Зачем ТС придумал sendd? Экономия на push'ах?
     
  6. twgt

    twgt New Member

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    1,494
    По идее сокет.
    Наверное приведённый кусок не открывает всей картины.
     
  7. q_q

    q_q New Member

    Blog Posts:
    0
    Joined:
    Oct 5, 2003
    Messages:
    1,706
    twgt
    Про первый парамер Я НЕ ПРАВ.
    Код #4 похож на правду, осталось разобраться какой ассемблер переварит push addr buff.
     
  8. Y_Mur

    Y_Mur Active Member

    Blog Posts:
    0
    Joined:
    Sep 6, 2006
    Messages:
    2,494
    OFFSIDE
    Разумеется
    mov esi,[esp]
    invoke send,s,addr buff,sizeof buff
    jmp esi
    не только мусорит в стеке, оставляя за собой не вытолкнутые адреса возврата, но и портит работу предсказателя ret, что приведёт к лишним тормозам, даже если чистить стек через pop или add esp, 4

    лучше сделать
    sendd:
    invoke send,s,addr buff,sizeof buff
    db 0C3h ; ret без эпилога
    И все проблемы решатся ;)
     
  9. OFFSIDE

    OFFSIDE New Member

    Blog Posts:
    0
    Joined:
    Sep 23, 2006
    Messages:
    106
    Есть инструкция retn:) Y_Mur спасиб;)