__asm

Тема в разделе "MS Visual C++", создана пользователем DSDante, 5 авг 2009.

  1. DSDante

    DSDante Гость

    Решил переписать на ассемблере кусок одной программы, вставив в ней __asm { ... }. При этом столкнулся с двумя проблемами.
    Во-первых, в коде нельзя объявлять переменные (пишет, мол, нельзя использовать эту область памяти), и приходится обращаться по полному 32-х разрядному адресу. Функцию желательно оптимизировать по скорости по максимуму, а такие обращения замедляют цикл.
    Вторая проблема - нельзя использовать директивы препроцессора типа equ. Просто неудобно.

    Если кто-то что-то знает по этому поводу - подскажите, пожалуйста.
    Написал в раздел про VC++, поскольку проблема характерна именно для этого компилятора.
    Не ругайте за технический язык, я едва знаю ассемблер.
     
  2. ????

    ???? Гость

    начни с изучения кода на ассемблере сгенерированного из неоптимизированного куска программы, может и переписывать на асме не понадобится.

    > в коде нельзя объявлять переменные
    но можно обращаться к переменным объявленным вне __asm

    > нельзя использовать директивы препроцессора типа equ.
    не могу проверить, но #define объявленный выше, должен восприниматься
     
  3. DSDante

    DSDante Гость

    Спасибо.

    #define и прадва работает.

    Я, кстати, смог запустить в VC проект, состоящий из единственного .asm файла. Вспомнилось из "Два капитана 2" про доктора, вызвавшего оргазм неживой материи. <_< Также круто и бестолково - чтобы сделать что-то, нужны файлы типа windows.inc.

    Кстати, задача, которую я делал на асме: дан массив чисел и еще одно число. Найти такую комбинацию элементов массива, сумма которых наиболее близка к тому числу (и количество которых минимально при равной сумме). При очевидном алгоритме при n элементов где-то 25-27 чисел программа работает больше минуты (точно не считал). На ассемблере я сделал перебор кодов Грея (каждое следущее число отличается от предыдущего одним битом, см. Генри Уорен мл., "Алгоритмические трюки для программистов") так, что при каждом шаге нужно добавлять или вычитать одно число. Скорость работы увеличилась, соответственно в n раз, но при n>28 ждать уже слишком долго.
    А над этой задачей я думал время от времени уже 6 лет. Оказалось все плохо. :)
     

Поделиться этой страницей