LINUX.ORG.RU

Ассемблерная вставка в gcc


0

0

Вот, не получается что-то у меня собрать программку в которой есть функция с ассемблерной вставкой:

void MyCpuCpuidComm(int toAX, int * myEAX, int * myEBX, int * myECX, int * myEDX) { int x1=0, x2=0, x3=0, x4=0;

__asm__ ("movl toAX, %eax\n\t" "cpuid\n\t" "movl $x1, %eax\n\t" "movl $x2, %ebx\n\t" "movl $x3, %ecx\n\t" "movl $x4, %edx" ); (* myEAX) = x1; (* myEBX) = x2; (* myECX) = x3; (* myEDX) = x4;

}

gcc (версия 3.3.3) нормально компилирует, но на этапе линковки выдает: cpu.o: undefined reference to 'toAX' и то же самое для переменных x1, x2, x3, x4.

Как это полечить?

anonymous

нет в ассемблерных вставках символов, соответствующих аргументам функции. аргументы на стеке сидят, его значение на входе сохраняется в %ebp и обращаешься ты к ним как 4 (%ebp), 8 (%ebp) и т п.

вставку совсем неправильно написал :| в gcc всё не так просто. Первоисточник - info gcc, раздел "C Extensions", секция "Extended Asm". прочитай там про входные и выходные параметры, и примеры кода там тоже есть

erDiZz
()

Упс. все съехало...

void MyCpuCpuidComm(int toAX, int * myEAX, int * myEBX, int * myECX, int * myEDX) {
int x1=0, x2=0, x3=0, x4=0;

__asm__ ("movl toAX, %eax\n\t"
"cpuid\n\t"
"movl $x1, %eax\n\t"
"movl $x2, %ebx\n\t"
"movl $x3, %ecx\n\t"
"movl $x4, %edx" );

(* myEAX) = x1; (* myEBX) = x2; (* myECX) = x3; (* myEDX) = x4;
}

Я в асме плохо разбираюсь, может кто напишет как это для gcc правильно написать?

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

...если сам не хочешь...
из /usr/src/linux/include/asm-i386/processor.h:

/*
 * Generic CPUID function
 */
static inline void cpuid(int op, int *eax, int *ebx, int *ecx, int *edx)
{
        __asm__("cpuid"
                : "=a" (*eax),
                  "=b" (*ebx),
                  "=c" (*ecx),
                  "=d" (*edx)
                : "0" (op));
}

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