Линейная сборка - PullRequest
       31

Линейная сборка

2 голосов
/ 11 мая 2010

Для приведенного ниже кода, если я хочу преобразовать цикл for во встроенную сборку, как это будет сделано? (Простите за странный код, я только что придумал.)

1) Это для x86, с использованием visual studio

2) Это вопрос «как использовать в сборке строк», а не вопрос «как оптимизировать этот код»

3) Подойдет любой другой пример. Я подумаю о лучшем примере кода в abit.

Хорошо, я надеюсь, что это лучший пример:

int doSomething(double a, double b, double c)
{
    double d;
    for(int i=100;i<200;i++)
    {
        d = a*a + b*b + c*c;
        if(d>i)
            return (i-99);
    }
    return -1;
}

Ответы [ 6 ]

5 голосов
/ 11 мая 2010

Вероятно, начнется что-то вроде этого неполного и несколько неэффективного примера.Однако следует продемонстрировать синтаксис.

double doSomething(void) {
    double a=1,b=2,c=3;
    __asm {
        mov ecx,10
loop:
        fld a // a
        fmul st(0),st(0) // aa
        fld b // b aa
        fmul st(0),st(0) // bb aa
        fsubp // aa-bb
        fstp c // c = a*a-b*b

        // and so on

        dec ecx
        jnz loop
    }
    return a+b+c;
}

Другой вариант - использование инструкций SSE.

Встроенный ассемблер VC ++ описан здесь: http://msdn.microsoft.com/en-us/library/4ks26t93.aspx

Процессор IntelСправочные руководства находятся здесь: http://www.intel.com/products/processor/manuals/

3 голосов
/ 11 мая 2010
2 голосов
/ 11 мая 2010

Полностью зависит от компилятора и архитектуры. Вам нужно будет найти в Интернете информацию о встроенном asm для вашего компилятора, а затем изучить коды asm op для вашей архитектуры (в правильном asm dialect - в зависимости от компилятора).

1 голос
/ 11 мая 2010

Нет реальной точки обучения встроенной сборке. Это не поддерживается для x64 (с Visual Studio, то есть). Независимо от того, используете ли вы x64 сейчас или нет, в какой-то момент вы будете в курсе событий.

Лучше научитесь использовать MASM, а то, что вы изучите для x86, все еще будет полезно для x64.

1 голос
/ 11 мая 2010

Вы можете оптимизировать это, не прибегая к ассемблеру:

double doSomething(void)
{
    double a = 1.0, b = 2.0, c = 3.0;
    c = a * a - b * b;
    b = c;
    return a + b + c;
}

Или, если вы повысите уровень оптимизации:

double doSomething(void)
{
    return -5.0;
}
0 голосов
/ 11 мая 2010

Ваш лучший вариант - заставить компилятор распечатать язык ассемблера для функции. Используйте это как основу для встроенной сборки.

Как правило, следует избегать встроенной сборки, поскольку она зависит от платформы, особенно от процессора. Лучшее решение - поместить функцию в отдельный файл. Создайте версию на C и версию на ассемблере. В процессе сборки выбирайте между разными файлами. Это позволит вам иметь разные версии ассемблера для разных платформ и процессоров с минимальными побочными эффектами для остальной части вашей программы (что очень важно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...