Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > G++: Компиляция __builtin_ функций.


Автор: JackYF 26.10.2006, 16:28
Доброго времени суток, форумчане.
Проблема следующая.

Использую среду Code::Blocks сборка 23102006, компилятор MinGW G++ из поставки CodeBlocks 1.0 RC2.

Мне требуется делать в коде С++ ассемблерные вставки. По умолчанию компилятор разпознает и использует AT&T синтаксис.
Включение Intel - синтаксиса, как выяснилось, делается путем добавления к опциям компилятора "-masm=intel".

Все бы хорошо, но:
Многие из математических функций определяются напрямую в MinGW-библиотеках как __builtin_, то есть непосредственно транслируемые в ассемблер. И при использованию опции компилятора "-masm=intel" и одновременно вызове функций типа

std::log10 и т.д.

Компилятор пишет сообщения об ошибке типа:
"Не могу скомпилировать ассемблерную инструкцию < и далее идут ассемблерные инструкции в AT&T синтаксисе >.

Вопрос: как с этим можно бороться? smile 

Использовать вставки на AT&T Ассемблере не предлагать.

Автор: MAKCim 26.10.2006, 17:02
Цитата

Использовать вставки на AT&T Ассемблере не предлагать.

AT&T синтаксис - true, зря не хотите использовать
Варианты решения
1. Использовать вместо стандартных функций чего-нибудь непривязанное к ассемблеру
2. Переписать нужные функции в Intel-синтаксисе  smile 

Автор: JackYF 26.10.2006, 21:16
Цитата(MAKCim @  26.10.2006,  17:02 Найти цитируемый пост)
AT&T синтаксис - true, зря не хотите использовать


Ага, всюду и везде читал и учил Intel - синтаксис, а теперь переходить на AT&T - забавно...
Если честно, мне он очень не нравится... Но это все личное...

Переписывать сии функции - значит переписать половину MinGW'шного <cmath>. По-моему, не выход.
Все-таки мне странно, что компилятор поступает подобным образом.


Ладно, допустим, я решу попробовать AT&T синтаксис...
MAKCim, посоветуй электронные буки по сабжу.

Автор: MAKCim 26.10.2006, 21:49
Цитата

Все-таки мне странно, что компилятор поступает подобным образом.

действительно, только что проверил - все работает (правда под Linux)
Цитата

MAKCim, посоветуй электронные буки по сабжу. 

Кратко но по делу у Зубкова: "Assembler для DOS, Windows, UNIX"
http://openlib.org.ua/ru/books/id/11/

Автор: JackYF 27.10.2006, 15:24
MAKCim, спасибо за буку, почитаю.
Странно, сколько искал книжки по программированию и Ассемблеру в частности, на этот сайт не натыкался...

Если будут еще интересные предложения ( например, все-таки укротить G++, пишите... ). 

Автор: JackYF 27.10.2006, 18:18
Дополнительный вопрос по этой же теме:

Есть С++-функция, которой передали несколько целочисленных параметров.

Как в ассемблерной вставки к этим именам обращаться?

Имя, ПодчеркиваниеИмя - не помогло. Компилятор и среда - см. в первом посте.
В книге Зубкова: "Assembler для DOS, Windows, UNIX" - нету. Там только краткий обзор... И не рассматривается взаимодействие с внешними языками.

Если можно, пример или ссылку на пример.  smile 

Автор: MAKCim 27.10.2006, 19:23
Цитата

Как в ассемблерной вставки к этим именам обращаться?

http://advancedlinuxprogramming.com
Если кратко, сложение a=a+b;
Код

void F(int a, int b) {
    __asm__(
        "addl %1, %0" :   /* собственно команды, разделяются ; или \n */
        "=r" (a) :              /* выходные операнд (могут быть операнды, разделяются ,) (в данном примере в a записывается значение из регистра %0) */
        "r"   (a), "r" (b)   /* входные операнды (считаются слева-направо, т. е %0 -> a, %1 -> b) */
    );
}

в скобках стоит "r" и "=r"
знак = означает выходной операнд
буква r означает любой регистр, вместо r можно писать идентификаторы конкретных регистров: "a", "b", "c"
http://www.advancedlinuxprogramming.com/alp-folder/alp-ch09-inline-asm.pdf

Автор: JackYF 30.10.2006, 17:38
Приблизительно начинаю понимать... Хотя после Intel - овского синтаксиса выглядит просто жуть.
Но что-то в этом есть.


MAKCim, еще раз спасибо и респект.

Автор: MAKCim 30.10.2006, 18:26
Цитата

Хотя после Intel - овского синтаксиса выглядит просто жуть.

У AT&T синтаксиса куча преимуществ по сравнению с Intel-овским
все дело в привычке, после M$ на *NIX тоже тяжело приходится

Автор: JackYF 30.10.2006, 20:18
Да уж, привычка - вторая натура.
Тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)