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

Discussion in 'WASM.BEGINNERS' started by mix_mix, Aug 22, 2006.

  1. mix_mix

    mix_mix Михаил

    Blog Posts:
    0
    Joined:
    Oct 8, 2005
    Messages:
    277
    Location:
    Токио
    Итак, что-то давно сюда не писал...
    Но сегодня я принес поганую весть: 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

    Blog Posts:
    0
    Joined:
    Jul 13, 2005
    Messages:
    475
    имхо что-то не то ибо XP SP2 не меняет эт точно
     
  3. mix_mix

    mix_mix Михаил

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

    Broken Sword Robert

    Blog Posts:
    0
    Joined:
    Aug 30, 2002
    Messages:
    433
    При входе в WindowProc - конечно нельзя полагаться на значение ebx. Это давно известный факт в 2K
     
  5. IceStudent

    IceStudent Active Member

    Blog Posts:
    0
    Joined:
    Oct 2, 2003
    Messages:
    4,300
    Location:
    Ukraine
    Хм.. Сорец не смотрел, много весит.

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

    asmfan New Member

    Blog Posts:
    0
    Joined:
    Jul 10, 2006
    Messages:
    1,004
    Location:
    Abaddon
    Тоже была такая проблема давненько - низя передавать значения в регистрах в callback'и ибо выньдос сама их юзает до вызова оных калбэков. Выяснил это для себя раз и на всегда.
    Code (Text):
    1. xor ebx, ebx
    делаешь прямо в callback'е и всё хорошо...
     
  7. SWR

    SWR New Member

    Blog Posts:
    0
    Joined:
    May 11, 2006
    Messages:
    226
    Location:
    Russia
    Да я тоже заметил но только EBX (ну и EAX, с EIP :) )
     
  8. SWR

    SWR New Member

    Blog Posts:
    0
    Joined:
    May 11, 2006
    Messages:
    226
    Location:
    Russia
    А на что указывает (хранит) EBX может что то нужное?
     
  9. IceStudent

    IceStudent Active Member

    Blog Posts:
    0
    Joined:
    Oct 2, 2003
    Messages:
    4,300
    Location:
    Ukraine
    Системное. Просто переменные, которые хранит система между вызовами колбэков.
     
  10. Jupiter

    Jupiter Jupiter

    Blog Posts:
    0
    Joined:
    Aug 12, 2004
    Messages:
    532
    Location:
    Russia
    более того, если в WindowsProc (под Win2k SP4) менять ebx и не восстанавливать до выхода, то прога может упасть. при этом в Win9x и WinXP всё ок
     
  11. IceStudent

    IceStudent Active Member

    Blog Posts:
    0
    Joined:
    Oct 2, 2003
    Messages:
    4,300
    Location:
    Ukraine
    Jupiter
    Чтобы не учиться танцам с бубном, следуй документации - то есть, сохраняй и восстанавливай всегда.
     
  12. diamond

    diamond New Member

    Blog Posts:
    0
    Joined:
    May 21, 2004
    Messages:
    507
    Location:
    Russia
    В 9x в оконной процедуре нельзя менять esi, ибо вызов оконной процедуры выглядит примерно так:
    Code (Text):
    1. mov esi,esp
    2. ...
    3. call ...
    4. ...
    5. mov esp,esi