Винда меняет ebx

Тема в разделе "WASM.BEGINNERS", создана пользователем mix_mix, 22 авг 2006.

  1. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Итак, что-то давно сюда не писал...
    Но сегодня я принес поганую весть: Windows 2000 SP4 менят значения ebx, esi, edi (и еще чуть ли не все регистры fpu).
    Фанaты xor ebx, ebx в начале проги и push ebx вместо push 0 - обломитесь :dntknw:((
    Написал я давно прогу, которая получает значение всех "ячеек" контрола ListView. Оказалось, что она не работает у одного человека, которого я и обучил пользоваться отладчиком, сказал сделать скриншот. Неверующим выкладываю прогу, ее исходник, и скрин чувака. Добавлю, что ebx, edi и esi, менялись много-много раз в программе.
    -- Added --
    Мда, может я дурак, но файл у меня не загрузился, точнее загрузился, но этого не видно.
    http://y2k6.narod.ru/ListViewReport.tar.bz2 <- Брать здесь
     
  2. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    имхо что-то не то ибо XP SP2 не меняет эт точно
     
  3. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Угу, я знаю. В том то и вся фишка, что в 2000 бред такой. Ты на скрине посмотри - там аж все регистры сопроцессора красные (опять же не только в этом месте).
     
  4. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    При входе в WindowProc - конечно нельзя полагаться на значение ebx. Это давно известный факт в 2K
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Хм.. Сорец не смотрел, много весит.

    Не только в начале проги, а и в любых функциях обратного вызова (callback), коими являются WindowsProc, ThreadProc и т.п. Это не открытие, а факт.
     
  6. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Тоже была такая проблема давненько - низя передавать значения в регистрах в callback'и ибо выньдос сама их юзает до вызова оных калбэков. Выяснил это для себя раз и на всегда.
    Код (Text):
    1. xor ebx, ebx
    делаешь прямо в callback'е и всё хорошо...
     
  7. SWR

    SWR New Member

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    226
    Адрес:
    Russia
    Да я тоже заметил но только EBX (ну и EAX, с EIP :) )
     
  8. SWR

    SWR New Member

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    226
    Адрес:
    Russia
    А на что указывает (хранит) EBX может что то нужное?
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Системное. Просто переменные, которые хранит система между вызовами колбэков.
     
  10. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    более того, если в WindowsProc (под Win2k SP4) менять ebx и не восстанавливать до выхода, то прога может упасть. при этом в Win9x и WinXP всё ок
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Jupiter
    Чтобы не учиться танцам с бубном, следуй документации - то есть, сохраняй и восстанавливай всегда.
     
  12. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    В 9x в оконной процедуре нельзя менять esi, ибо вызов оконной процедуры выглядит примерно так:
    Код (Text):
    1. mov esi,esp
    2. ...
    3. call ...
    4. ...
    5. mov esp,esi