Почему функции не передается значение?

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

  1. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    есть обычный код типа этого:
    Код (Text):
    1. ...
    2. pu    PROTO  :DWORD
    3. ...
    4.  
    5. pu proc x:DWORD
    6. ...
    7. mov edi,x
    8. ...
    9. pu endp
    10.  
    11. ...
    12. invoke pu,8
    13. ...
    Так вот что то непонятное со значением в x. Прога нормально компилируется и работает пока я необращаюсь к функции pu, как только к ней обращаюсь - сразу прога виснет. Здесь точно что то не то с передачей значения, потому что когда место передачи значения x я использую глобальную переменную - все работает так, как надо.
    По каким причинам это может быть?
     
  2. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Вот и гадай что у тебя там вместо троеточий... Толи ты ret забыл поставить, толи еще что.
     
  3. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    ret не забыл, вот код функции
    Код (Text):
    1. PUSH EBP
    2.     MOV EBP,ESP    
    3.     xor eax,eax
    4.  
    5.  
    6.     mov ecx,8
    7.     mov edi,x
    8. lab5:
    9.     mov edx,0
    10.     add     dl, 20h
    11.     mov tSuma[edi],dl
    12.     inc edi
    13.     loop lab5
    14.  
    15.     mov eax, number
    16.        push eax
    17.  
    18.         xor     ecx, ecx
    19.         mov     ebx, 10
    20. oi2:
    21.         xor             edx,edx
    22.         div     ebx
    23.         push    edx
    24.         inc     ecx
    25.  
    26.        test    eax, eax
    27.        jnz     oi2 
    28.  
    29.     mov esi,x
    30. oi3:
    31.         pop     edx
    32.    
    33.         add     dl, 30h
    34.     mov tSuma[esi],dl;
    35.     add esi,1  
    36.  
    37.         loop    oi3
    38.        
    39.         pop eax
    40.  
    41.     MOV ESP,EBP    
    42.     POP EBP        
    43. ret
     
  4. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Это не код - это жесть какая-то. Как минимум, если пролог-эпилог ты пишешь сам и ф-ция принимает параметры, ты должен эти параметры вытолкнуть из стека (либо сам либо return+размер параметров в байтах).
    push edx у тебя в одном цикле, а pop в другом, ты уверен, что не рушишь стек?
    Про оптимизацию я вообще молчу пока ))
     
  5. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Я же говорю, что функция четко работает когда я передаю значение через глобальную переменную. то есть она работает так, как задумано. То есть со стеком все четко (судя по "внешним" последствиям, то есть работает).
    А вот на счет вытолкнуть принятые параметры из стека - это интересно. Что то мне подсказывает что именно здесь проблема. Можно вас попросить, поподробней описать что мне нужно сделать в этом направлении.

    Про оптимизацию я тоже молчу пока:). Как только функция заработает - буду думать как бы это попроще сделать...
     
  6. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Кстати а что это значит? А кто его еще кроме меня напишет? Я гдето читал что так надо! И все тут. Конечно все работает и без этого, ну надо так надо - вот и добавил. Или ненадо? Можно поподробней?
     
  7. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    ********* **** ******* **** ***** ******************* чтобы **** ***** **** твою ******

    Чувак, ты отладчик открывать не пробовал? Потрассировать немного код, посмотреть, что на точке входа, что в стеке?

    П.С.: модераторы, разрешите мат на васме! ну очень прошу. Просто слов нет от такой школоты
     
  8. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Точно. Убрал пролог с эпилогом и все заработало!

    Мои вопросы с прологом в силе - хотелось бы разобратся зачем это надо, и когда это надо писать.
     
  9. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Ага, а вы наверное родились специалистом. Если нет слов, то вас ни кто незаставляет отвечать здесь. Идите в разделы для спецов - там глупых вопросов незадают.
     
  10. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Ну если компилятор у тебя масм и ф-ция имеет параметры, то пролог (push ebp, mov ebp, esp) и эпилог (mov esp, ebp, pop ebp) он напишет сам.
    Либо не пиши их вовсе и оставляй просто ret в конце ф-ции, либо в конце вместо ret - retn 4, ну или add esp, 4 и потом уже retn 4.
     
  11. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    сорри, в последней строке просто ret ("и потом уже ret")
     
  12. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    У меня масм. Теперь все ясно. Спасибо большое.
    Тема закрыта.
     
  13. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    MSoft
    Ну что ты так? Человек же только начинает. Про отладчик все правильно сказал.
     
  14. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Я тебя не прошу в уме реверсить фемиду. Просто открой отладчик и посмотри. Ты даже не попытался ничего сделать, а уже побежал на форум. Вот если б ты спросил "я увидел в отладчике два пролога, откуда взялся второй?", это был бы нормальный вопрос новичка. Но ты же даже не попытался посмотреть, в чем там дело. Пытаться программировать и не использовать отладчик... бррр. На битву экстрасенсов Вам, батенька, надо
     
  15. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    А ты неподумал что я чисто теоретически могу быть настолько тугодумным, что неумею этими делами пользываться. Разумеется со временем научусь, но вот например хотел в RadASMе посмотреть - так там надо еще строчки добалять для дебага. Тут бы в своем коде незаблудится, а меня просят еще что то добавлять - то есть 50% кода это строчки для отладки! Правда при глюках мой eVMB c++ показывает что то, но там вообще темный лес для меня...
     
  16. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    olly debugger
     
  17. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    MSoft


    Не буду вас больше злить:)). После решения проблемы с передачей значений у меня очень много задач появится, там уж точно прийдется это освоить. Без анализа отладчика сюда больше не сунусь:))
     
  18. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Вот. Это то, что я ожидал от дебагера. Спасибо.
     
  19. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    sheef_ad
    почитай хелп к масму 611 или кипа ирвина там сказано что иногда директива proc генерирует код
    причем в хелпе довольно неплохо написано как управлять этой генерацией