LINUX.ORG.RU

[C/C++][ASM] Проблема при линковке и использовании Intel-синтаксиса

 


0

0

Добрый день!

Компилирую программу, в которой надо слинковать два файла (к примеру), в одном стандартные функции - обертки к ассемблеру x86:

#define INTEL_ASM __asm(".intel_syntax noprefix\n");
....
INTEL_ASM
__asm("mov eax, 9\n");
....

компилируется это все с опцией -masm=intel Этап компиляции проходит успешно, но заваливается линковка:

undefined reference to 'ebx'

undefined reference to 'какая-то переменная из инлайна'

и т.д.

Как решить эту проблему, не переписывая все в АТТ синтаксис? Спасибо!

P.S. Учить синтаксис АТТ не предлагать - в основном программу развивают люди кто пишет на интел-нотации ассемблера.

★★★★★

__asm(".intel_syntax noprefix\nmov eax, 9\n");
попробуй так
может получится

dimon555 ★★★★★
()

в приведённом коде не используется регистр ebx. Возможно ошибка в другом месте? Можно показать больше кода? Или ассемблерных вставок больше нет?

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

Вот пример - функция

void __cdecl kgetpalette(unsigned x, unsigned y, unsigned *palette)
{
        register unsigned _ecx = x * 65535 + y;
        INTEL_ASM
        __asm("mov ecx, _ecx\n");
        __asm("mov edi, palette\n");
        __asm("xor ebp, ebp\n");
        __asm("push 8\n");
        __asm("pop esi\n");
        __asm("int 0x23\n");
}

ругается что palette не определен при линковке - компилит отлично!

XVilka ★★★★★
() автор топика
Ответ на: комментарий от rha

Спасибо! Уже сам нашел!

Сразу добавлю, если вдруг кто смотреть будет строки вида:

__asm("mov eax, some_var\n");
заменяем на
__asm("mov eax, %0\n"::"r"(some_var));

А записывающие переменные:

__asm("mov some_var, eax\n");
заменяем на
__asm("mov %0, eax\n":"=r"(some_var));

Как оказалось просто GNU AS имеет недочеты при работе с интел синтаксисом.

XVilka ★★★★★
() автор топика
Ответ на: комментарий от XVilka

Чорт, при чем здесь недочеты, судя по твоей функции, неизбежны side-effects, потому что значения регистров в конце функции не восстанавливаются и надеятся далее на нормальную работу не стоит, gcc extended asm для того и нужен, чтобы сказать gcc, какие регистры или память ты меняешь своим кодом.

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

frey прав.

XVilka: см. на clobber list

т.е. типа

[code] __asm(«mov ecx, $0\n»::«r»(_ecx): «eax»); [/code]

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