Помогите разобраться с функциями...

Тема в разделе "WASM.BEGINNERS", создана пользователем sheef_ad, 4 фев 2010.

  1. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    проблема возникла уже 3 дня над ней бьюсь, не могу понять в чем дело!!! Есть примерно такой код:
    ...
    .if eax==10
    in10:
    .if mas[esi]!=62
    invoke SetWindowText,hSuma,addr Tree1 ;если этой строчки нет...
    .else
    ...
    .endif
    inc esi
    jmp in10

    .elseif eax==12
    in12:
    .if mas[esi]!=62
    invoke SetWindowText,hSuma,addr Tree2 ;...то эта строчка работает!!!!
    .else
    ...
    .endif
    inc esi
    jmp in12
    .endif
    ....

    то есть в коменариях я написал в чем проблема. Обычное отображение текста в первом условии почему то непозволяет работать второму условию!!!! Достаточно убрать SetWindowText в первом условии и второе тут же начинает работать!!!!!
    Как такое возможно?? Почему это происходит???
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    У меня только одно предположение - SetWindowText портит регистр esi ?
    А вообще для таких вопросов отладчик удобнее.
     
  3. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Вот и я не пойму в чем дело...
     
  4. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    sheef_ad
    Необходимо видеть, какой там на самом деле код. В плане, не машкод, конечно – но чистый ассемблерный код без макросов.
     
  5. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Ох... С удовольствием бы показал, но пишу я на константах - недорос еще до чистого...
     
  6. sheef_ad

    sheef_ad New Member

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

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Попробую добавить один момент, на который я обратил внимание. Перед этими условиями шел такой код:
    go:
    .if mas[esi]==32 ;для символа "пробел"
    .if mas[esi+1]==105 ;для символа i
    .if mas[esi+2]==100 ;для символа d
    .if mas[esi+3]==61 ;для символа =
    .if mas[esi+4]==34 ;для символа "

    .if mas[esi+6]!=34
    movzx eax,mas[esi+5]
    sub eax,30h
    mov ebx,10
    mul ebx
    movzx ebx,mas[esi+6]
    sub ebx,30h
    add eax,ebx
    invoke data,eax,esi
    .else
    movzx eax,mas[esi+5]
    sub eax,30h
    invoke data,eax,esi
    .endif

    .endif
    .endif
    .endif
    .endif
    .endif
    inc esi
    loop go

    То есть я из xml файла читаю id (весь файл предварительно записан в массиве mas) и отправляю этот id в функцию data где эти самые условия на которых я торможусь.
    Щас сформулирую - продолжу....
     
  8. sheef_ad

    sheef_ad New Member

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

    Код (Text):
    1. .if eax==10                    ;  id ==10
    2. in10:
    3.     .if mas[esi]!=62
    4. ...
    5.     .endif
    6.  
    7. .elseif eax==11                ; id ==11 - id идут подряд и все работает
    8. in11:
    9.     .if mas[esi]!=62    
    10. ...
    11.     .endif
    12. .endif
    А вот неробочий код:

    Код (Text):
    1. .if eax==10                    ;  id ==10
    2. in10:
    3.     .if mas[esi]!=62
    4. ...
    5.     .endif
    6.  
    7. .elseif eax==11                ; id ==11 - этот id я игнорирую и ни как необрабатываю
    8. .elseif eax==12               ; id ==12 - зато теперь этот перестает работать...
    9. in12:
    10.     .if mas[esi]!=62    
    11. ...
    12.     .endif
    13. .endif
     
  9. Rockphorr

    Rockphorr Well-Known Member

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

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Конечно цикл - а выход простой:

    in10:
    .if mas[esi]!=62
    invoke SetWindowText,hSuma,addr Tree1
    .else
    jmp exit
    .endif
    inc esi
    jmp in10
    exit:
     
  11. FLASH300

    FLASH300 New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2008
    Сообщения:
    72
    наверно надо еще несколько наводящих вопросов ))
    Код (Text):
    1. .if eax==10                    ;  id ==10
    2. in10:
    3.     .if mas[esi]!=62
    4. ...
    5.     .endif
    6.  
    7. .elseif eax==11                ; id ==11 - этот id я игнорирую и ни как необрабатываю
    8. .elseif eax==12               ; id ==12 - зато теперь этот перестает работать...
    9. in12:
    10.     .if mas[esi]!=62    
    11. ...                  <-------- как из цикла то выходим ?
    12.     .endif
    13. .endif
    14.                      <-------- а тут что ?
    А под отладчиком глянуть не как ? Доходит ли поток до функции ? Если доходит что функция возвращает ?
     
  12. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Добавлю: функция invoke SetWindowText,hSuma,addr Tree1 что то портит (долго рассказывать как я к этому пришел, но на 99.9% уверен что это так ). Но вот как вызываемая функция может изменять регистры (именно регистры, переменные здесь не фигурируют) у вызывающей??? Если не регистры, тогда как вызываемая может искажать вызывающую???
     
  13. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    С удовольствием...
    Отладчик мое слабое место. Неумею я им пользываться. да и код настолько большой, да еще и в чистом асме я слаб - так что часто я даже нужное место в дисасме найти немогу.

    А вот как раз после первого условия (.elseif eax==11 ) до второго код недоходит почемуто. Проверил как раз функцией invoke SetWindowText,hSuma,addr Tree1 примерно таким образом:

    .elseif eax==11
    SetWindowText,hSuma,addr Tree1
    .elseif eax==12
    SetWindowText,hSuma,addr Tree2

    (это я так без отладчика выкручиваюсь:)) так вот переменная Tree1 выводится, а переменная Tree2 - нет, хотя как раз Tree2 и должна быть в hSuma, ибо она последняя. то есть это говорит о том, что строчка SetWindowText,hSuma,addr Tree1 каким то образом меняет вызывающую функцию...
     
  14. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    наверное стоит упростить все (без циклов) и вывести общий код (собрать в кучу) что бы Вам, уважаемые спецы , проще было с ориентироваться.

    Код (Text):
    1. search proc sz:DWORD
    2.  
    3.     mov esi,0
    4.     mov ecx,sz
    5. go:
    6.     .if mas[esi]==32    ;для символа "пробел"
    7.         .if mas[esi+1]==105 ;для символа i
    8.             .if mas[esi+2]==100 ;для символа d
    9.                 .if mas[esi+3]==61  ;для символа =
    10.                     .if mas[esi+4]==34  ;для символа "
    11.  
    12.                         .if mas[esi+6]!=34
    13.                             movzx eax,mas[esi+5]
    14.                             sub eax,30h
    15.                             mov ebx,10
    16.                             mul ebx
    17.                             movzx ebx,mas[esi+6]
    18.                             sub ebx,30h
    19.                             add eax,ebx
    20.                             invoke data,eax,esi
    21.                         .else
    22.                             movzx eax,mas[esi+5]
    23.                             sub eax,30h
    24.                             invoke data,eax,esi
    25.                         .endif
    26.  
    27.                     .endif
    28.                 .endif
    29.             .endif
    30.         .endif
    31.     .endif
    32.     inc esi
    33.     loop go
    34.  
    35. ret
    36. search endp
    37.  
    38. data proc idd:DWORD,i:DWORD
    39.  
    40.     mov esi,i
    41.     mov eax,idd
    42.     .if eax==12 ;ионный двигатель
    43.             invoke SetWindowText,hSuma,addr Tree2        ;эта переменная выводится
    44.     .elseif eax==13
    45.             invoke SetWindowText,hSuma,addr Tree1       ; а вот эта уже нет? Вопрос почему?
    46.     .endif
    47.  
    48. ret
    49. data endp
     
  15. FLASH300

    FLASH300 New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2008
    Сообщения:
    72
    1) data proc uses ecx idd:lol: WORD,i:lol: WORD
    2)Апи функции сохраняют только esi edi ebx ebp esp ))
    3)Вписываем в нужное место int 3 для поиска в отладчике.
    4)Как без отладчика жить то ? Жесть !!!
     
  16. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Ешкин кот!!!! Вставил только эту строчку и все заработало!!!! Аж 100 тон с души упало - 3 дня бьюсь - уже голодный обморок на горизонте:)), а тут все так просто....

    А каким вы пользуетесь?
     
  17. FLASH300

    FLASH300 New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2008
    Сообщения:
    72
    ollydbg как и большинство ))
     
  18. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Вот и у меня он есть - а как - неумею. Может сказывается мой прошлый опыт работы с visual c++/c#. Там все прозрачно. А вот здесь как только запускаю в дебагере програму на выполнение - окошко програмы выскакиваетс и все. Как по остальным событиям пробежаться в коде (например кнопка нажалась), непонимаю - все тупо висит без движений....Когда то освою. Когда более менее в асме понимать начну (хотябы код сносно читать) буду разбираться основательно...
    Спасибо за помощь..

    П.С. А что означает uses ? Гугль чете молчит по этому поводу...
     
  19. FLASH300

    FLASH300 New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2008
    Сообщения:
    72
    хех ) это можно подсмотреть в любом отладчике
    http://www.wasm.ru/publist.php?list=23
     
  20. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Все, понял. Api не сохраняют регистр ecx, а uses сохраняет нужный регистр (ecx в нашем случае)

    Еще раз спасибо всем, кто помогал.