LINUX.ORG.RU

Assembler??? В С коде

 , ,


0

3

Здравствуйте! Подскажите, как испльзовать директорию asm, а то никак не пойму, и да, не работает код:

#include <stdio.h>

int main()
{
	int sum = 0, x = 1, y = 2;
	int sum2 = 0, x2 = 1, y2 = 2;
        asm (	"add %3, %2;"
        	"add %1, %0;"
         : "=r" (sum), "=r"(sum2) : "r" (x), "0" (y), "r"(x2), "r"(y2));
        printf("%d %d\n", sum, sum2);
}

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

anonymous
()

А что ты пытаешься сделать, чудак? sum = x + y, sum2 = x2 + y2?

#include <stdio.h>

int main()
{
    int sum = 0, x = 1, y = 2;
    int sum2 = 0, x2 = 1, y2 = 12;
    asm (   "mov %2, %0; add %3, %0;"
            "mov %4, %1; add %5, %1;"
            : "=r" (sum), "=r"(sum2)
            : "g" (x), "g" (y), "g"(x2), "g"(y2));
    printf("%d %d\n", sum, sum2);
    return 0;
}
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

anonymous
()

И всё-таки лучше освоить вызов функций из ассемблерных модулей — так программа будет переносимей.

luke ★★★★★
()
asm("команда\n"
        "команда\n"
       : "=r"(outparam0), "=g"(outparam1), "=a"(outparam2)
       : "0"(inparam0), "r"(inparam3)
       :"f","g","cc","memory");

означает, что блок асм работает с 3 выходами, двумя входами:

outparam0, outparam1, outparam2, inparam0, inparam3;

после первого двоеточия = это выходы. после второго двоеточия = входы. после третьего = «повреждаемые» командами регистры, регистр флагов"cc" или «память» указывают на то, что компилятор не должен ничего хранить в регистра f и g, не должен рассчитывать на сохранность регистра флагов, и не должен переупорядочивать команды чтения-записи памяти вокруг блока асм(«memory»).

r говорит что место для параметра = регистр общего назначения.

g =r или место в памяти(обрати внимание что память может адресоваться относительно регистра, не занимай все регистры)

=x говорит что это выход а не вход.

в ассемблерном коде они нумеруются по порядку их указания в сорцах и потому имеют такие номера:

outparam0 = %0 , outparam1 = %1, outparam2 = %2, inparam0 = %0, inparam3= %3;

обрати внимание на inparam0: по воле программиста он должен быть помещен в то же место, где находился *param0 (на это указывает «0»).

поэтому для него не выделяется номер среди формальных параметров.

ckotinko ☆☆☆
()
Ответ на: комментарий от ckotinko

и да, забыл.

в моем примере «=a» - явно указывает что outparam2 будет лежать в регистре a

ckotinko ☆☆☆
()

C99

#include <stdio.h>
int main()
{
    static int sum __asm__("asum") = 0 , x __asm__("ax") = 1, y __asm__("ay") = 2;
    static int sum2 __asm__("asum2") = 0 , x2 __asm__("ax2") = 1, y2 __asm__("ay2") = 2;
    __asm__ volatile("mov ax,%eax\n"\
        "add ay,%eax\n"\
        "mov %eax,asum\n"\
        "mov ax2,%ebx\n"\
        "add ay2,%ebx\n"\
        "mov %ebx,asum2\n"
        );
    printf("%d %d\n", sum, sum2);
    return sum+sum2+x+y+x2+y2;
}

gcc -std=c99

TOXA ★★
()

ух ты... спасибо вам! пошел грузить гранит науки

academiq
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.