Есть вопрос

Тема в разделе "WASM.A&O", создана пользователем fatall, 13 сен 2009.

  1. fatall

    fatall New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2009
    Сообщения:
    2
    есть код в котором используется оператор switch, компилирую в cl.exe от Microsoft Visual Studio 2005(8), для оператора switch и последующих case, компилятор генерирует таблицу джампов, которую помещает после функции в которой используеься сам switch. функцию я инжектирую в чужой процесс..фукнция выделяется при помощи
    void start_func(void){} и void end_func(void){} в начале и конце соответсвенно. проблема в том что при разборе кода сгенерированного компилятором присутствуют джампы, ссылающиеся на сгенерированную таблицу.
    есть ли флаг для cl.exe или может быть другой компилятор, которому можно явно сказать не генерировать таблицу джампов для switch... case ?
    флаг /Os нипомогает

    а что плохого в том что джампы?
    Ответ:
    есть функция которая переносится в чужой процесс
    для того чтобы знать сколько переносить в начале и конце ставятся пустые функции stat_func и end_func - они как метки, все что между ними переносится в чужой процесс
    таким образом мы можем определить начало откуда переносить и размер сколько переносить
    при компиляции кейсов компилятор вставляет таблицу переходов после end_func
    тоесть если теперь перенести функцию в чужой процесс считай что часть ее останется не перенесенной и соответственно функционал свой она потеряет
    Почему не асемблеровские вставки?
    на кейсе многовато кода... всмысле выбор большой...
    ну там порядка 60 кейсов.... представь это все на асм перегонять...
    --
    да это не код, а таблица переходов, в коде на нее ссылки идут, как на сегмент данных
    jmp ds:off_407BC4[eax*4]
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    оптимизация по размеру, тогда по идее не должен
     
  3. fatall

    fatall New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2009
    Сообщения:
    2
    по размеру /Os - не помогает, значительно сокращает таблицу но не избавляется от нее вовсе
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    имелось ввиду /O1
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    можно не использовать switch... case
    а использовать if/else if
     
  6. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    fatall
    Один может попробовать #pragma code_seg. Т.е. 'func_start' запихнуть в секцию ".text$FUA", 'func_end' – в ".text$FUZ", а нужные функции между ними – в ".text$FUU".
     
  7. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    fatall
    Проверил? Отпишись, ага?