Обнаружил глюк. Не пойму кто виноват?

Тема в разделе "WASM.ASSEMBLER", создана пользователем gas, 21 авг 2011.

  1. gas

    gas New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2010
    Сообщения:
    52
    Сёдня пол-дня искал причину почему глючит токошто написанный макрос.
    Когда нашёл - офигел. Если после pusha, до первого обычного push будет любое изменение региста eax - исключение 0C0000005h (обращение по адресу не имея на то прав) . Любые команды после pusha выполняются нормально, а вот менять eax, пока не произведён хоть какой-нибудь push - нельзя!
    Это Fasm глючит, или процессор? (проверить на других компиляторах нет возможности, а на совершенно разных процессорах Intel - одно и тоже ) Или это вообще не глюк, а так и должно быть?
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    gas
    Так быть не должно. Полный минимальный пример, где проявляется описанная ситуация, в студию.
     
  3. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    DEL (Практически дубль l_inc)
     
  4. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Скорее всего дело в этом. Смотрели в отладчике во что преобразуется Ваш код?
     
  5. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    не может такого быть. Проверьте, не делаете ли вы обращение к [eax] вместо eax (то есть к памяти вместо регистра). В отладчике пошагово смотрели, что получается после макроса?
     
  6. gas

    gas New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2010
    Сообщения:
    52
    Отладчиком не пользуюсь (отлаживаю вставкой в исследуемые места макроса записывающего что надо в лог)

    Глюк оказывается не везде, а только в макросах. Тот же самый код вставленный без макроса - работает.
    Вот пример:
    ;-----------
    macro ВЫВЕСТИ_S32 источник, место
    {
    pusha
    pushf
    xor eax,eax ;глюк вызывает любое изменение eax
    pushd источник
    mov ebx,место
    pushd [ebx+_текст]
    call SDword_в_строку
    call Отрисовать
    popf
    popa
    }
    ;-----------------
    Если изменение eax вставить после pushd источник - работает
    Если тот же код ставить без макроса (вместо "источник" и "место" прописать теми что передавалось в макрос) - работает
     
  7. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    gas
    Ахахах, как же вы тогда решили, что ошибка именно на инструкции xor eax, eax?
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    gas
    Oh, come on! Опять Вы со своими русскими именами.

    Минимальный полный пример нужен. На указанном коде никаких исключений не возникает.
     
  9. gas

    gas New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2010
    Сообщения:
    52
    Ezrah
    В моём коде ошибка и явно на изменении eax (любом). И только если перед этим был pusha. После pushd xxxx с eax можно делать всё что угодно.

    Ну, вобщем ясно - глючит Fasm... А я так был в нём уверен.

    А логами, в которые могу записать любые содержимое нужных регистров в любом нужном месте - отлаживается очень даже неплохо.
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    gas
    Ну разумеется. Или на крайняк в винде баг. Или в процессоре. Но ни в коем случае не в коде. Вы ведь так круто его своими логами отладили.

    В общем, как знаете.
     
  11. gas

    gas New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2010
    Сообщения:
    52
    l_inc
    Зачем весь код? Достаточно того что я проверил - если xor eax,eax вставить в самом начале процедуры SDword_в_строку - что абсолютно ничего не меняет в принципе - глюка нет.
     
  12. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Напомнило мне это:
    http://www.wasm.ru/forum/viewtopic.php?id=41711
     
  13. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    gas
    Затем, что я для чистоты эксперимента тоже проверил. Указанный макрос при раскрытии не вызывает никаких исключений.
     
  14. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Проявлю свои дедуктивные способности и умозаключу, что "место" передаётся в макрос через регистр eax.
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Ezrah
    Скорее это.
     
  16. gas

    gas New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2010
    Сообщения:
    52
    Ezrah
    Да. Почти так и есть, только не место, а источник.

    Что-то у меня подклинивает...
     
  17. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    gas
    Пользуйтесь отладчиком. http://ollydbg.de/odbg200.zip распакуйте, запускайте, перетаскивайте в него исполняемый файл, и всё.
     
  18. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    gas
    Даже в ассемблере место, где произошло исключение и его причина не обязательно по одному и тому же адресу происходят. На команде xor eax,eax исключение 0xC0000005 не может произойти.
    Раз не хотите отладчик - поставьте команду загрузки не нуля. Например 0x400000
    В конце концов включите полный листинг и посмотрите, что за команда стоит следом за xor eax,eax !
    -----------------------------
    А по принципу "чудес не бывает" : либо результат компиляции pushd содержит обращение к [EAX], либо что-то грузит в EAX , а оно потом у вас где-то используется!
     
  19. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    gas, в общем код в студию. Так быстрее будет.
     
  20. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Igor1024
    зачем тут код? Уже и так понятно, что при передаче в качестве источника eax, это
    Код (Text):
    1. xor eax,eax ;глюк вызывает любое изменение eax
    2. pushd источник
    разворачивается в
    Код (Text):
    1. xor eax, eax
    2. push eax
    и одна из следующих функций читает по нулевому указателю.