Ассемблерная вставка. GNU компилятор
От: TnedutS  
Дата: 09.08.05 10:07
Оценка:
Привет всем.
Мне надо использовать асм вставку. А я не особо в этом опытный.
Пишу просто для пробы:
...
void printab(int );//то есть функция объявлена
...
int x1;
asm("pushl %0\n\tcall printab \n\tpop %%eax" : : "r" (x1));
...
Пишет мне
undefined reference to printab

Смотрел в инете. Нашел, например это:

asm ("movl %0,r9\n\tmovl %1,r10\n\tcall _foo"
: /* no outputs */
: "g" (from), "g" (to)
: "r9", "r10");

Но ведь тут тоже _foo неопределена.
Это отсюда:
http://gcc.activeventure.org/Extended-Asm.html#Extended-Asm

Смотрел и др. сайты. Примеры одни и те же.

Попытался сделать это подобным образом
asm("pushl %0\n\tcall %1 \n\tpop %%eax" : : "r" (x1),"r"(printab));

Пишет предупреждение
indirect call without '*'
Но работает. Но что значит это предупреждение?
Как от него избавиться?
Объясните пожалуйста, что это значит, и как от этого избавиться.
И как тогда сделать "direct call"?
Спрашивал на других форумах, но пока никто не ответил.

09.08.05 17:44: Перенесено модератором из 'C/C++' — Павел Кузнецов
Re: Ассемблерная вставка. GNU компилятор
От: Glоbus Украина  
Дата: 09.08.05 10:13
Оценка:
Здравствуйте, TnedutS, Вы писали:

TS>Привет всем.

TS>Мне надо использовать асм вставку. А я не особо в этом опытный.

А не пробовал что-нить типа

asm {
  .....
}
Удачи тебе, браток!
Re: Ассемблерная вставка. GNU компилятор
От: MaximE Великобритания  
Дата: 09.08.05 11:50
Оценка:
TnedutS wrote:

> Привет всем.

> Мне надо использовать асм вставку. А я не особо в этом опытный.
> Пишу просто для пробы:
> ...
> void printab(int );//то есть функция объявлена
> ...
> int x1;
> asm("pushl %0\n\tcall printab \n\tpop %%eax" : : "r" (x1));
> ...
> Пишет мне
> undefined reference to printab

C++ mangling.

extern "C" void printab(int );


Если не хочешь extern "C", то nm my_obj.o и посмотри какое mangled имя у printab.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re: Ассемблерная вставка. GNU компилятор
От: TnedutS  
Дата: 09.08.05 12:27
Оценка:
Уточню.
Операционка win xp. Компилятор gcc 3.3.3 Из cygwin.
Пишу в эклипсе 3.1.0 в cdt.
Re[2]: Ассемблерная вставка. GNU компилятор
От: TnedutS  
Дата: 09.08.05 13:16
Оценка:
Здравствуйте, Glоbus, Вы писали:

G>Здравствуйте, TnedutS, Вы писали:


TS>>Привет всем.

TS>>Мне надо использовать асм вставку. А я не особо в этом опытный.

G>А не пробовал что-нить типа


G>
G>asm {
G>  .....
G>}
G>


Такое не прокатывает, к сожалениею
Re[2]: Ассемблерная вставка. GNU компилятор
От: TnedutS  
Дата: 09.08.05 13:19
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>TnedutS wrote:


>> Привет всем.

>> Мне надо использовать асм вставку. А я не особо в этом опытный.
>> Пишу просто для пробы:
>> ...
>> void printab(int );//то есть функция объявлена
>> ...
>> int x1;
>> asm("pushl %0\n\tcall printab \n\tpop %%eax" : : "r" (x1));
>> ...
>> Пишет мне
>> undefined reference to printab

ME>C++ mangling.


ME>
ME>extern "C" void printab(int );
ME>


ME>Если не хочешь extern "C", то nm my_obj.o и посмотри какое mangled имя у printab.


ME>--

ME>Maxim Yegorushkin

Не помогает extern "C"
Re[2]: Ассемблерная вставка. GNU компилятор
От: TnedutS  
Дата: 09.08.05 13:21
Оценка:
Здравствуйте, Glоbus, Вы писали:

G>Здравствуйте, TnedutS, Вы писали:


TS>>Привет всем.

TS>>Мне надо использовать асм вставку. А я не особо в этом опытный.

G>А не пробовал что-нить типа



G>
G>asm {
G>  .....
G>}
G>

Не прокатывает...
Re[2]: Ассемблерная вставка. GNU компилятор
От: TnedutS  
Дата: 09.08.05 13:22
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>TnedutS wrote:


>> Привет всем.

>> Мне надо использовать асм вставку. А я не особо в этом опытный.
>> Пишу просто для пробы:
>> ...
>> void printab(int );//то есть функция объявлена
>> ...
>> int x1;
>> asm("pushl %0\n\tcall printab \n\tpop %%eax" : : "r" (x1));
>> ...
>> Пишет мне
>> undefined reference to printab

ME>C++ mangling.


ME>
ME>extern "C" void printab(int );
ME>


ME>Если не хочешь extern "C", то nm my_obj.o и посмотри какое mangled имя у printab.


ME>--

ME>Maxim Yegorushkin

Пишет то же самое. Я уже пробовал.
Re[3]: Ассемблерная вставка. GNU компилятор
От: MaximE Великобритания  
Дата: 09.08.05 13:25
Оценка:
TnedutS wrote:

[]

> Пишет то же самое. Я уже пробовал.


Я пробовал — у меня все линкуется. Может ты забываешь объектник с ф-цией прилинковать?

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[4]: Ассемблерная вставка. GNU компилятор
От: TnedutS  
Дата: 09.08.05 13:38
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>TnedutS wrote:


ME>[]


>> Пишет то же самое. Я уже пробовал.


ME>Я пробовал — у меня все линкуется. Может ты забываешь объектник с ф-цией прилинковать?


ME>--

ME>Maxim Yegorushkin

Я сделал совсем просто сейчас.
Все удалил. Создал файл

probe.c

#include <stdio.h>
int x=0;

#ifdef __cplusplus
extern "C" void printab(int);
#endif

void printab(int x1) {
if (++x<20)
asm("pushl %0\n\tcall printab \n\tpop %%eax" : : "r" (x));
printf("%u\n",x1);
}

int main(int argc, char* argv[])
{

printab(x);

}


затем написал g++ -0 probe probe.c

Получил
...:probe.c:undefined reference to 'printab'
collect2:ld returned 1 exit status

Вот...

Может, я правда, что-то не так делаю?
Или это из-за компилятора все же?
версия, какя уже писал 3.3.3
Операционка winxp.
Re[5]: Ассемблерная вставка. GNU компилятор
От: Lorenzo_LAMAS  
Дата: 09.08.05 14:06
Оценка:
TS>Может, я правда, что-то не так делаю?
TS>Или это из-за компилятора все же?
TS>версия, какя уже писал 3.3.3
TS>Операционка winxp.

Под линуксом и g++ 3.2.3 у меня все пашет. Может у тебя под вин
версия г++ добавляет еще что-нить к имени функции? например _ перед именем?
Of course, the code must be complete enough to compile and link.
Re[6]: Ассемблерная вставка. GNU компилятор
От: TnedutS  
Дата: 09.08.05 14:24
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

TS>>Может, я правда, что-то не так делаю?

TS>>Или это из-за компилятора все же?
TS>>версия, какя уже писал 3.3.3
TS>>Операционка winxp.

L_L>Под линуксом и g++ 3.2.3 у меня все пашет. Может у тебя под вин

L_L>версия г++ добавляет еще что-нить к имени функции? например _ перед именем?

Точно! Сейчас посмотрел ассмовский файл!!!
Там действительно добавляется подчеркивание!!!
Вот это дела...
Спасибо огромное!
Re[6]: Ассемблерная вставка. GNU компилятор
От: TnedutS  
Дата: 09.08.05 14:27
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

TS>>Может, я правда, что-то не так делаю?

TS>>Или это из-за компилятора все же?
TS>>версия, какя уже писал 3.3.3
TS>>Операционка winxp.

L_L>Под линуксом и g++ 3.2.3 у меня все пашет. Может у тебя под вин

L_L>версия г++ добавляет еще что-нить к имени функции? например _ перед именем?

...
/APP
pushl %eax
call printab
pop %eax
...
Re[7]: Ассемблерная вставка. GNU компилятор
От: Lorenzo_LAMAS  
Дата: 10.08.05 06:58
Оценка:
TS>...
TS>/APP
TS> pushl %eax
TS> call printab
TS> pop %eax
TS>...

ну так если сделать

asm("pushl %0\n\tcall _printab \n\tpop %%eax" : : "r" (x1));


Все работает, я проверял (WinXP, Cygwin, g++ 3.3.3)
Of course, the code must be complete enough to compile and link.
Re[8]: Ассемблерная вставка. GNU компилятор
От: TnedutS  
Дата: 10.08.05 07:29
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

TS>>...

TS>>/APP
TS>> pushl %eax
TS>> call printab
TS>> pop %eax
TS>>...

L_L>ну так если сделать


L_L>
L_L>asm("pushl %0\n\tcall _printab \n\tpop %%eax" : : "r" (x1));
L_L>


L_L>Все работает, я проверял (WinXP, Cygwin, g++ 3.3.3)


Ну да. Я как раз уже и сделал.
Еще раз спасибо.
Еще раз спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.