как в Билдере с++ 6.0 работать с асм? и вызвать функцию в с++ по указателю?

Тема в разделе "WASM.BEGINNERS", создана пользователем dead_body, 22 июн 2006.

  1. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    вот такие проблемы.

    надо сделать лабу на с++ с высчитыванием простых чисел более 1 000 000 000.

    я сделал, но преподу не понравилось.

    вот теперь заново переделываю. Использую алгоритм динамического построения делителей до стартового порого(откуда начать считать);

    хотел для повышения скорости переписать одну функцию на асм.

    но столкнулся с рядом проблем.



    1)Вначале не смог вставить асм код. Вернее код да я втавил, но линкер отказался линковать. Как я понял в обьекте(лаба по ООП), он не хочет вставлять мой асм код.

    Тогда я решил сделать по другому.
    Код (Text):
    1.  
    2. void *p = &asm_func;
    3.  p();


    но так он не хочет вызывать.

    это была проблема 2.



    тогда я решил сделать в опкодах вызов

    call dword ptr [ebp-4]

    но так и не понял как это сделать в СИ.

    Как указать этому Билдеру, что это Опкоды!



    Вот и мои три проблемы...

    1)Как вставить асм вставку в функции обьекта.asm{} - не получилось в обьекте. Так работает(в другой функции).

    2)как сделать что то похожее на это:
    Код (Text):
    1.  
    2. void *p = &asm_func;
    3.  p();


    - можно любым другим методом.

    3)как написать что то в опкодах?



    2 и 3 пункт нужны потому что первый не работает, и вот пытаюсь извратиться.

    Думаю может аргументы какой то АПИ передать не те, и что бы по выходу она мне asm_func вызвала...
     
  2. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Попробуй SEH.
     
  3. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Не, вызов асм кода через SEH преподу тоже может не понравится. Неужели там нету простых вставок _asm { } ?
     
  4. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    есть, я же писал.

    но если есть асм вставка в функции/методе(тьфу! ну и придумали), который принадлежит обьекту то линкер материться. в visual c++ 6.0 всё нормально было.
     
  5. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Не, SEH тоже не подойдет, че то я не сразу въехал в суть.

    Создай поток, получи его конкекст и установи eip на адрес функции.
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    лаба по С++ вот и пиши на ++

    грамотно написанный код на С++ вряд ли уступит

    asm'у
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    оформи асм код в отдельную процедуру



    PS: а линкер здесь каким боком? Очевидно на асм вставку может ругаться только компилятор
     
  8. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    вот именно. Компилер отработал все хорошо, а линкер ругаеться на unresolved symbol+имя моей асм функции.



    но выход я уже нашел, обьявил функции, как дружественную, и вроде всё заработало.



    но вот скорости, всё равно не впечатляют...
     
  9. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    dead_body

    вот такие проблемы.

    надо сделать лабу на с++ с высчитыванием простых чисел более 1 000 000 000.

    я сделал, но преподу не понравилось.


    Наверно препод на 386 запустил, поконтовался часик и решел, не катит ;)



    Самый брутальный способ вычисления у меня на машине работал 111секунд, со стандартным fmodl из math.h,

    а пустой цикл прощел за 12 секунд(Селекон 2.6 MHz)


    Код (Text):
    1.  
    2. #include "stdafx.h"
    3. #include <stdio.h>
    4. #include <math.h>
    5. #include <time.h>
    6.  
    7. int main(int argc, char* argv[])
    8. {
    9.     long double i,f = 1000000000;
    10.  
    11.     time_t t = time(NULL);
    12.  
    13.     for(i=2; i<f; i++) {
    14.         if(fmodl(f,i) == 0) {
    15.             /*
    16.             puts("false");
    17.             return(0);
    18.             */
    19.             __asm {
    20.                 nop
    21.             }
    22.         }
    23.     }
    24.  
    25.     printf("%d Sec.",time(NULL)-t);
    26.     return 0;
    27. }




    Наверное нужен очень хитрый алгоритм.



    В математике не силен, но уже знаю что простые числа многих довели до ручки :)

    Вычилять ряд неимеверно затратно, легче просто делить до победного. Составлять таблицу, получается 1.8Гб(1000000000/4*8), может и сойдет если принести программу на DVD диске. Еще, наверное, можно составить таблицу контрольных точек, там например через куждую тысячу записывать одно простое число, потом находить ближайщее и по нему ваыичислять оставщийся ряд пока не встретишь заданное для вычисления значение(если не ощибся таблица получается 1.8Мб 1000000000/4/1000*8байт.Впринципе вполне терпимо и поиск быстро отработает и ряд продорлжать недлолго.



    А как делают ученые мужи?
     
  10. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Smile

    для __int64.
    Код (Text):
    1.  
    2. if(h%deliteli[r] == 0);


    работает у меня вроде быстрее, чем:
    Код (Text):
    1. fmodl(h,deliteli[r]);




    как можно увеличить скорость кода в аттаче?

    я просто уже незнаю, но завтра сдавать, а скорости ~= 0.

    (для тех компов де это будет(1.4 проц,256 оперативы))

    у меня та более менее нормально идёт.



    может работу с файлом добавить?

    сколько простых чисел до 100 000 000, хотя бы примерно?
     
  11. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
  12. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    Запакуй нормальным zip у меня 7z нету



    http://314159.ru/belov/prostie.htm



    Здесь есть программа, вычисляет болшее простое число по меньшему. Есть очень большая проблема, формула написана на VB, я было собрался перевести на С++, но руки не поднялись, после 3 строчки уже ругался матом.



    Нужно оттуда выжать формулу и сгенерировать талицу.



    сколько простых чисел до 100 000 000, хотя бы примерно?



    Если на глаз, то кждое третье-четвертое число простое

    100000000/4 = 25000000



    Но это для таблицы тоже много, поэтому записывать нужно только каждое 1000 число

    100000000/4/1000 = 25000



    Потом делать примерно так(N - число для тестирования)

    ищем в таблице самое первое число которое больше n, когда нашли берем из таблицы число которое меньше N(это будет L) проверяем все простые числа начиная с L, если среди них не окажется N, то число к простым не относится.


    Код (Text):
    1.  
    2. bool FindPrimeDigit(__int64 L, __int64 N)
    3. {
    4.     for(;;) {
    5.         if(L == N)
    6.             return(true);
    7. // згенерировать следующее простое число
    8.         l = GetNextSimpleDigit(less);
    9. // Когда Л болше Н то искать уже бесполезно
    10.         if(L > N)
    11.             return(false);
    12.     }
    13. }
    14.  
    15. for(int i=0; i<max_table_size; i++) {
    16.     if(n < table[i]) {
    17. // Вместо table[i-1] нужно искать в обратном направлении
    18. // это я схалтурил и решил что предидущее число меншье N
    19.         FindPrimeDigit(table[i-1],n)
    20.     }
    21. }




    Тема интересная, но сам я проверить не могу, автобус через 3 часа, еду отдыхать в деревню :)



    Ты уж не поленись испробуй и мой способ, расскажешь потом что получилось, удачи!
     
  13. P_F

    P_F New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2006
    Сообщения:
    116
    Адрес:
    Russia
    Вот и мои три проблемы...

    1)Как вставить асм вставку в функции обьекта.asm{} - не получилось в обьекте. Так работает(в другой функции).

    2)как сделать что то похожее на это:



    void *p = &asm_func;

    p();



    - можно любым другим методом.

    3)как написать что то в опкодах?





    Если ещё интересно смотри это:

    [​IMG] _899440844__DemoAsm.rar
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    dead_body





    может не хватало
    Код (Text):
    1. #ifdef __cplusplus
    2.    extern "C" {
    3. #endif
    4.  
    5. unsigned long __stdcall foo(unsigned char *, unsigned long);
    6.  
    7. #ifdef __cplusplus
    8.    }
    9. #endif




    Smile





    Стало быть и нормального WinRAR у тебя тоже нет, т.к.

    он 7z распаковывает, начиная кажется с 3.40 или чуть раньше
     
  15. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    сколько простых чисел до 100 000 000, хотя бы примерно?



    Количество простых чисел, не превосходящих N асимптотически при больших N равно N/ln(N).



    Информации по простым числам - море как Инете, так и в библиотеке.