Приколы компилятора VS C++

Тема в разделе "WASM.HEAP", создана пользователем Neonix, 22 июл 2010.

  1. Neonix

    Neonix New Member

    Публикаций:
    0
    Регистрация:
    2 май 2009
    Сообщения:
    839
    Компилируем следующую строчку
    if(b<a) a=b

    а на выходе получаем:
    004113DD mov eax,dword ptr
    004113E0 cmp eax,dword ptr [a]
    004113E3 jge wmain+4Bh (4113EBh)
    004113E5 mov eax,dword ptr
    004113E8 mov dword ptr [a],eax
    ...
    004113EB xor eax,eax
    И как это понимать?
    Я же задал ЕСЛИ А БОЛЬШЕ B-> присваиваем А значение B, а скомпилилось в ЕСЛИ А БОЛЬШЕ ЛИБО РАВНО B-> обнуляем А!!!!!!!!!!
    Произвол!!
    В чем дело!?
     
  2. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    b<a <=> a>=b,
    а обнуляется твоя a потому, что не была инициализирована, скорее всего.
    ня? .3

    в любом случае, moar code.
     
  3. Neonix

    Neonix New Member

    Публикаций:
    0
    Регистрация:
    2 май 2009
    Сообщения:
    839
    Com[e]r
    да, сначала просто резервируется память под переменные, а значения вводятся позже с консоли. сейчас попробую с инициализацией.
    ЗЫ: вроде я читал где-то что переменные в С не обязательно инициализировать. достаточно их объявить. это СИшная фича, в отличае от Паскаля например.
    Сейчас попробую и отпишусь.
     
  4. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    дурной тон есть дурной тон.
    за исключением необоснованного дурного тона, естественно.

    так или иначе, оно тебе обнулило непроинициализированную переменную, всё идёт по плану.
     
  5. Neonix

    Neonix New Member

    Публикаций:
    0
    Регистрация:
    2 май 2009
    Сообщения:
    839
    Com[e]r
    да, Вы правы. Инициализировал всё пошло как надо.
    Хм.. и всё-таки нехорошо как-то, ведь я читал про необязательную инициализацию в каком-то учебнике по С. причем учебник серьёзный, для вузов.. хочется побить автора за такие наколы))
     
  6. Neonix

    Neonix New Member

    Публикаций:
    0
    Регистрация:
    2 май 2009
    Сообщения:
    839
    Если у кого ещё есть примеры по сабжу(кроме инициализации переменных), приводите. Очень интересно.
    ЗЫ: в принципе можно обсуждать не только VS C++, но и любые другие сишные компиляторы.
     
  7. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Neonix
    читать надо только стандарт и справку компилятора
     
  8. Neonix

    Neonix New Member

    Публикаций:
    0
    Регистрация:
    2 май 2009
    Сообщения:
    839
    GoldFinch
    это по молодости было) сейчас просто вспомнил.
     
  9. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
    GoldFinch
    VS и стандарт, Ха ....

    Neonix
    Вы посмотрите сколько багов в дизассемблере, вот это смеху... раньше я думал что MS нормально дизассмит, но реально, редко используемые команды такие глупости...
     
  10. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
    П.С.
    Выяснил когда смотрел diStorm, в котором оказалось баги, в некоторых VS выигрывает в некоторых проигрывает ...
     
  11. Neonix

    Neonix New Member

    Публикаций:
    0
    Регистрация:
    2 май 2009
    Сообщения:
    839
    IceCrashLdr
    что за diStorm? зачем, если на всё есть Ида?
    Кстати насчет дизасма от студии, правда полный гуан.
     
  12. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
    в google diStorm

    Дело дажет не в гуане, дизассмит не правельно...
     
  13. Neonix

    Neonix New Member

    Публикаций:
    0
    Регистрация:
    2 май 2009
    Сообщения:
    839
    IceCrashLdr
    я про это и говорю. другие критерии не в счет. вот Вы говорите редко используемые команды не правильно анализирует, а вот и нет! обламывается на на самых обыкновенных. те же джампы чего стоят..
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Neonix
    Прувы в студию.
     
  15. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia

    Где тут произвол, ткните пальцем! При чем тут неинициализированные - инициализированные, ткните пальцем! Все совершенно правильно. Скомпилировалось в (ЕСЛИ Б МЕНЬШЕ А, А=Б), кристально ясно и понятно.

    Ничего нигде не обнуляется, фантазии это ваши. Обнуляется eax - так это типа признак sucсess, return(0). Или еще для каких надобностей. С чего вы вдруг решили, что обнуление eax = обнулению [a]?
     
  16. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Более того, после
    Код (Text):
    1. 004113DD  mov         eax,dword ptr [b]
    2. 004113E0  cmp         eax,dword ptr [a]
    3. [b]004113E3  jge         wmain+4Bh (4113EBh)
    в eax находится а вовсе не [a] :))
     
  17. Neonix

    Neonix New Member

    Публикаций:
    0
    Регистрация:
    2 май 2009
    Сообщения:
    839
    Booster
    пример выше. программа работает нормально, а дизассемблер от VS совсем другую логику выдает в листинге.
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Neonix
    Ничего такого не вижу.
     
  19. Neonix

    Neonix New Member

    Публикаций:
    0
    Регистрация:
    2 май 2009
    Сообщения:
    839
    jge и je разные вещи+прыгает на обнуление, когда выполнилось правильное условие.

    А как вам вам такая штука дебагера:
    задаем _stack=new Stack<Int32>()
    затем толкаем значения
    _stack.Push(1);
    _stack.Push(2);
    _stack.Push(3);
    ...
    _stack.Push(n);
    далее
    Int32 StackItem{get{return _stack.Pop();};}
    дебагер нам выдаст значение n в StackItem при просмотре его значения
    затем ещё раз get{return _stack.Pop();}
    и дебагер показывает что в стеке уже n-1! как вам это нравится?
    то есть он выполняет конструкцию _stack.Pop(), вместо того чтобы просто возвратить значение верхушки стека.
     
  20. Neonix

    Neonix New Member

    Публикаций:
    0
    Регистрация:
    2 май 2009
    Сообщения:
    839
    FatMoon
    С чего вы вдруг решили, что обнуление eax = обнулению [a]?
    дада, разобрался.. глюк в голове) там сравнивается В с А, а не А с В, с этого я и пошел ахинею нести=)

    Y_Mur

    ясный пень. я на cmp ступил=) бывает..