Microsoft Visual Studio и кодогенерация

Тема в разделе "LANGS.C", создана пользователем XshStasX, 27 дек 2011.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Можно ли в студии при использовании switch() case запретить генерировать такой переход jmp [eax*4 + base] адрес?
    А чтоб вместо этого делала условные переходы + сравнения ?
    Пробывал разные варианты оптимизации а также отключение релоков не помогает.
    switch не хочеться менять на if.

    Или чтоб по всему коду были относительные переходы/вызовы, где это возможно.

    Microsoft Visual Studio 2008.
     
  2. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    http://www.wasm.ru/forum/viewtopic.php?pid=458060#p458060
     
  3. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    > switch не хочеться менять на if
    если чисто из-за удобства и читабельности, то можно во что-то такое обернуть:

    Не тестил, но идея понятна.
    upd: c какого я посчитал, что и тут не будет jumptable'a - хз. чекни (:
     
  4. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    deLight
    Работает.
    Кроме такого варианта
    Код (Text):
    1. d = 23;
    2.     SWITCH( d )
    3.     {
    4.         CASE(23)
    5.         CASE(45)
    6.         {
    7.             break;
    8.         }
    9.     }
    10.     SWITCH_END
     
  5. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    XshStasX
    Вы бы сначала подставили макросы, а потом что-то утверждали.
     
  6. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Ezrah
    очепятка в пред. посте(d = 23, а не 45)
     
  7. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Ну так подставь.

    Код (Text):
    1. if(d==23)
    2.   if(d==45)
    3.   {
    4.     // body
    5.     break;
    6.   }
    Как не трудно заметить, тело не выполнится никогда, а по логике switch должно выполняться для d равного 23 и 45.