powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ассемблерные вставки в c++. GNU
35 сообщений из 35, показаны все 2 страниц
Ассемблерные вставки в c++. GNU
    #33206476
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем.
Я вот тут пытаюсь ассемблерную вставку в с++ запихнуть...
А не получается. Точнее получается... Но как - то криво.

Пишу просто для пробы:
...
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 '*'
Но работает. Но что значит это предупреждение?
Как от него избавиться?
Я просто не понимаю, что имеется ввиду.
Что не есть гут.
Объясните пожалуйста, что это значит, и как от этого избавиться.
И (если они есть) другие способы вызова функций.
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33206493
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TnedutSПишет мне
undefined reference to printab

Ну так объяви саму функцию. Хотя бы через
void printtab(void);
в начале модуля а потом уже и ассемблерные вставки могут быть.
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33206499
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так я объявил же...

void printab(int );
...
int x1 = 1;
asm("pushl %0\n\tcall printab \n\tpop %%eax" : : "r" (x1));
...
void printab(int a)
{
...
}

Или что-то другое имеется ввиду?
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33206502
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ниче не понил. но все равно что-нибудь скажу.

может так

Код: plaintext
1.
extern "C" void printab(int );

или

Код: plaintext
1.
extern "что-нибудь" void printab(int );
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33206503
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну это я просто видел в других OS подобную хрень...

типа extern "ASM", extern "OS", #pragma linkage( OS, ... ) ....
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33206505
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NewYearниче не понил. но все равно что-нибудь скажу.

может так

Код: plaintext
1.
extern "C" void printab(int );

или

Код: plaintext
1.
extern "что-нибудь" void printab(int );


Как было, так и осталось...
"undefined reference"
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33206507
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl TnedutSПишет мне
undefined reference to printab

Ну так объяви саму функцию. Хотя бы через
void printtab(void);
в начале модуля а потом уже и ассемблерные вставки могут быть.

Я все функции, которые создаю в начале модуля объявляю. И эта тоже в объявлениях есть.
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33206550
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TnedutSЯ все функции, которые создаю в начале модуля объявляю. И эта тоже в объявлениях есть.

Не скажу, что собака тут порылась... Но как вариант...
Обычно азм различает дальнии и ближнии переходы. Обычно делает это он, на автомате, если не указано явно. Попробуйте сам код подпрограммки расположить поближе от ассемблерной вставки.

с уважением
(круглый)
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33206555
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё одна мысля...
Сделайте для начала чиссо азмовскую метку. Попробуйте позвать её. Далее станет понятно - что хромает. Обьявление или что то ышо.

с уважением
(круглый)
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33206647
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0 TnedutSЯ все функции, которые создаю в начале модуля объявляю. И эта тоже в объявлениях есть.

Не скажу, что собака тут порылась... Но как вариант...
Обычно азм различает дальнии и ближнии переходы. Обычно делает это он, на автомате, если не указано явно. Попробуйте сам код подпрограммки расположить поближе от ассемблерной вставки.

с уважением
(круглый)

Сделал ближе некуда. Не помогло.

void printab(int a)
{
printf("I'm writing %d\n",a);
}

int main(int argc, char* argv[])
{
*********************
/*debug section
*/
int x1=1;

asm("pushl %0\n\tcall printab\n\tpopl %%eax" : : "r" (x1)/*,"r" (printab)*/);
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33206653
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0И ещё одна мысля...
Сделайте для начала чиссо азмовскую метку. Попробуйте позвать её. Далее станет понятно - что хромает. Обьявление или что то ышо.

с уважением
(круглый)

С метками сделал так.
...
void printab(int a)
{
printf("I'm writing %d\n",a);
}

int main(int argc, char* argv[])
{
*********************
/*debug section
*/
int x1=1;

asm("mark: pushl $0\n\t popl %eax\n\t");
asm("pushl %0\n\t call %1\n\tpopl %%eax\n\t jmp mark" : : "r" (x1),"r" (printab));
...

Замечательный вечный цикл получился.
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33206691
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже, придется ограничиться "кривым" способом. Хоть работает...
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33206895
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TnedutSПривет всем.
Я вот тут пытаюсь ассемблерную вставку в с++ запихнуть...
А не получается. Точнее получается... Но как - то криво.

Пишу просто для пробы:
...
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

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


Да все нормально работает. Немного код изменил, чтоб хоть какой то смысл придать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#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);
}

main() {
 printab(x);
}



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

Пишет предупреждение
indirect call without '*'
Но работает. Но что значит это предупреждение?
Как от него избавиться?
Я просто не понимаю, что имеется ввиду.
Что не есть гут.
Объясните пожалуйста, что это значит, и как от этого избавиться.
И (если они есть) другие способы вызова функций.
Если смотреть ассемблерный листинг, то в данном случае адрес printab помещается в eax (потому и не ругается на неизвестное имя ), затем происходит вызов call %eax, в первом же случае происходит вызов call printab напрямую
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33207033
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
#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);


Не работает....
Не понимаю.

Один в один скопировал - не пашет.
Может, в версии компилятора дело?

Кстати, на счет придания смысла.
Дело в том, что все делается ради того, чтобы сначала загнать в стек параметры, а потом вызвать какую-то постороннюю функцию.
Вот и тренируюсь на кошках.
А тут сама себя она вызывает как-то.
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33207048
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня gcc 3.3.3
Может, в этом дело?
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33207080
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TnedutS#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);


Не работает....
Не понимаю.

Один в один скопировал - не пашет.
Может, в версии компилятора дело?

Пробовал в Линуксе на 2.95.2 и 3.3.5 - нормально работало.

Операционка, имя файла, строка компиляции? Попробовать получить командой gcc -S имя_файл ассемблерный листинг и изучить его.

Кстати, на счет придания смысла.
Дело в том, что все делается ради того, чтобы сначала загнать в стек параметры, а потом вызвать какую-то постороннюю функцию.
Вот и тренируюсь на кошках.
А тут сама себя она вызывает как-то.
Да что она делает я понял, я не понял зачем тут бесконечная рекурсия (стек завалить чтоль) и передача мусора в качестве параметра.
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33207252
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
v6y TnedutS#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);


Не работает....
Не понимаю.

Один в один скопировал - не пашет.
Может, в версии компилятора дело?

Пробовал в Линуксе на 2.95.2 и 3.3.5 - нормально работало.

Операционка, имя файла, строка компиляции? Попробовать получить командой gcc -S имя_файл ассемблерный листинг и изучить его.


Кстати, на счет придания смысла.
Дело в том, что все делается ради того, чтобы сначала загнать в стек параметры, а потом вызвать какую-то постороннюю функцию.
Вот и тренируюсь на кошках.
А тут сама себя она вызывает как-то.
Да что она делает я понял, я не понял зачем тут бесконечная рекурсия (стек завалить чтоль) и передача мусора в качестве параметра.

Операционка WinXP проф.Version 2002 . Service Pack 2.
Я себе cygwin скачал.
Файл называется PartPC.cpp. Если это о компилируемом файле.
Ну там еще вдобавок
pseudoAPI.cpp и pseudoAPI.h - Это класс, который использую в PartPC.
Но сейчас этот класс не использую. Просто закомментировал все.
Строка компиляции...
Я использую eclipse cdt.
Там создается автоматический makefile.

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

ROOT := ..

-include $(ROOT)/makefile.init

RM := rm -rf

# All of the sources participating in the build are defined here
-include sources.mk
-include $(SUBDIRS:%=%/subdir.mk)
-include objects.mk
-include $(DEPS)
-include $(ROOT)/makefile.defs

all: PartPC.exe

PartPC.exe: $(OBJS)
@echo 'Building target: $@'
g++ -o $@ $(OBJS) $(USER_OBJS) $(LIBS)
@echo 'Finished building: $@'

clean:
-$(RM) $(OBJS) $(DEPS) PartPC.exe

.PHONY: all clean dependents

-include $(ROOT)/makefile.targets

Так это выглядит.

А про gcc -s.
Не уверен, что мне это сейчас поможет.
У меня очень мало опыта с асмом. Да и вообще в общем, надо сказать.
Я даже не знаю, что именно мне надо в листинге искать. Можно подсказать, что надо искать?
Я могу попробовать, но боюсь,правда, тогда ничего не успею...
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33207301
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Операционка WinXP проф.Version 2002 . Service Pack 2.
Я себе cygwin скачал.
Файл называется PartPC.cpp. Если это о компилируемом файле.
Ну там еще вдобавок
pseudoAPI.cpp и pseudoAPI.h - Это класс, который использую в PartPC.
Но сейчас этот класс не использую. Просто закомментировал все.
Строка компиляции...
Я использую eclipse cdt.
Там создается автоматический makefile.

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

ROOT := ..

-include $(ROOT)/makefile.init

RM := rm -rf

# All of the sources participating in the build are defined here
-include sources.mk
-include $(SUBDIRS:%=%/subdir.mk)
-include objects.mk
-include $(DEPS)
-include $(ROOT)/makefile.defs

all: PartPC.exe

PartPC.exe: $(OBJS)
@echo 'Building target: $@'
g++ -o $@ $(OBJS) $(USER_OBJS) $(LIBS)
@echo 'Finished building: $@'

clean:
-$(RM) $(OBJS) $(DEPS) PartPC.exe

.PHONY: all clean dependents

-include $(ROOT)/makefile.targets

Так это выглядит.

А про gcc -s.
Не уверен, что мне это сейчас поможет.
У меня очень мало опыта с асмом. Да и вообще в общем, надо сказать.
Я даже не знаю, что именно мне надо в листинге искать. Можно подсказать, что надо искать?
Я могу попробовать, но боюсь,правда, тогда ничего не успею...

Ужис, предупреждать надо (это я про ОС и все остальное) Вобщем предлагаю попростому. Мой вариант закинуть в отдельний файл, скажем tst.c, потом попробовать gcc -o tst tst.c, затем g++ -o tst tst.c Если все нормально, то проблема явно не в gcc. В листинге можно увидеть какое имя на самом деле используется компилятором. Например printab(int) на самом деле будет что типа _Z7printabi, если компилить в стиле C++.
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33207382
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
v6yУжис, предупреждать надо (это я про ОС и все остальное) Вобщем предлагаю попростому. Мой вариант закинуть в отдельний файл, скажем tst.c, потом попробовать gcc -o tst tst.c, затем g++ -o tst tst.c Если все нормально, то проблема явно не в gcc. В листинге можно увидеть какое имя на самом деле используется компилятором. Например printab(int) на самом деле будет что типа _Z7printabi, если компилить в стиле C++.

Блин. Было у меня чувство "Пиши в MVS". Так нет... Блин..
Итак...
Это 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);

}

Строка компиляции.
gcc - o probe probe.c

"undefined reference to printab"

При g++ - o probe probe.c
Та ж фигня
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33207414
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Менять g++?
Или есть еще варианты?
Или во всем виноват Билл Гейтс?
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33207737
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И, наконец, если кому интересно, решение!
Win добавляет функциям подчерки. Поэтому

после g++ -S probe.c (спасибо v6y :))

выглядело это так
...
_printab:
...
/APP
pushl %eax
call printab
pop %eax
...

Поэтому следовало сделать так:

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

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

void printab(int x1)
{
printf("%u\n",x1);
}

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

asm("pushl %0\n\tcall _printab \n\tpop %%eax" : : "r" (1));
//printab(x);
for(;;);

}

Спасибо всем!
И еще куче народу на других форумах:)
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33207876
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TnedutSИ, наконец, если кому интересно, решение!
Win добавляет функциям подчерки.
На самом деле это не Win. Это стандарт компиляторов С.
Это можно отключать специальным ключиком у компилятора или ключевымс словами. К сожалению ключевые слова разные у разных компиляторов. Большинство Windows-based компиляторов знают слово stdcall (или __stdcall).
GNU C использует слово asm: http://gcc.gnu.org/onlinedocs/gcc-4.0.1/gcc/Asm-Labels.html#Asm-Labels
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33207962
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
На самом деле это не Win. Это стандарт компиляторов С.

Это точно стандарт? Ссылку можно? (Вопрос для меня непринципиальный, поэтому самому искать ответ лень) Может быть это не стандарт, а типа соглашения компиляторов под Вин? Потому как под Линуксом по умолчанию никаких подчеркиваний впереди не добавляется - или там стандарт нарушают?
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33208070
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага.
Буду знать.
Спасибо
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33208099
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
v6y.... Может быть это не стандарт...

Более того, это зависит от того, кто чистит стэк. Вызывающий или вызываемый.


с уважением
(круглый)
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33208956
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
v6yЭто точно стандарт? Ссылку можно? (Вопрос для меня непринципиальный, поэтому самому искать ответ лень) Может быть это не стандарт, а типа соглашения компиляторов под Вин? Потому как под Линуксом по умолчанию никаких подчеркиваний впереди не добавляется - или там стандарт нарушают?
Ну насколько это "стандарт" я честно говоря не знаю :) Никогда не исследовал этот вопрос, но исключений из этого правила я не помню.
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33209549
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl v6yЭто точно стандарт? Ссылку можно? (Вопрос для меня непринципиальный, поэтому самому искать ответ лень) Может быть это не стандарт, а типа соглашения компиляторов под Вин? Потому как под Линуксом по умолчанию никаких подчеркиваний впереди не добавляется - или там стандарт нарушают?
Ну насколько это "стандарт" я честно говоря не знаю :) Никогда не исследовал этот вопрос, но исключений из этого правила я не помню.
Я прошу прощений за занудство, но можно уточнить - исключений из какого правила и где? Потому как повторю еще раз: В Линуксе (да и во FreeBSD, а возможно и в других UNIX-ах) никаких подчеркиваний к именам функций, если не указать специальный ключик, не добавляется При линковке здесь ищется именно функция main, а не _main, и если этот ключик указать при компиляции основного модуля, то будут проблемы. Далее, как следствие, все стандартные библиотеки скомпилированы с именами функций без ведущего подчеркивания, и если в модуле, компилируемом с вышеуказанным ключом, попытаться вызвать функцию (скажем printf) из такой библиотеки, то получим undefined name.
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33211420
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
v6yЯ прошу прощений за занудство, но можно уточнить - исключений из какого правила и где?
из правила: имя функции при компиляции предваряется знаком подчеркивания в C либо псевдослучайно (на основе имени класса) сгенерированым набором символом для C++ . Я не знаю зачем это делается, но все компиляторы чьи объектники и ассемблерный код я рассматривал делают именно так.
Я ни разу не рассматривал объектники сгенирование гнусью под FreeBSD и Linux. Потому что там библиотеки собираются тем же компилятором что и пользовательские программы, и различий в форматах библиотек быть не может.
А вот различных компиляторов под MS-DOS и Windows много, приходится иногда разбираться чем сделана та или иная библиотека. И все DOS/Windows компиляторы этому правилу следуют. Кстати, под QNX4 использовался Watcom чьи корни идут из ДОС - там тоже использовались подчеркивания, хоть QNX тоже юниксоподобная ОС :) В QNX6 уже GNU C используется, так что там может быть и нету подчерков в библиотеке.

v6yДалее, как следствие, все стандартные библиотеки скомпилированы с именами функций без ведущего подчеркивания, и если в модуле, компилируемом с вышеуказанным ключом, попытаться вызвать функцию (скажем printf) из такой библиотеки, то получим undefined name.
Все верно c точностью до наоборот :) Если например в MS VC скомпилировать модуль вызывающий printf() с запретом использовать подчеркивания - этот printf() не будет найден в стандартной библиотеке, потому что он там лежит как _printf() :)
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33211716
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Вот и я говорю - в форточках с досом одни правила без исключений, а в Линуксе другие. Намекаю значит, что это типа соглашение для той или иной ОС, а не правило или тем более стандарт вообще, как можно подумать из ваших постов :)
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33211761
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
v6y White Owl
Вот и я говорю - в форточках с досом одни правила без исключений, а в Линуксе другие. Намекаю значит, что это типа соглашение для той или иной ОС, а не правило или тем более стандарт вообще, как можно подумать из ваших постов :)
Да при чем здесь операционная система вообще? Из всех известных мне компиляторов только один GNU C не подчиняется этому правилу. Вроде бы не подчиняется! У меня просто нет сейчас возможности проверить :). Да, это не стандарт, но тем не менее это широко известное правило.
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33211941
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlДа при чем здесь операционная система вообще? Из всех известных мне компиляторов только один GNU C не подчиняется этому правилу. Вроде бы не подчиняется! У меня просто нет сейчас возможности проверить :). Да, это не стандарт, но тем не менее это широко известное правило.
Ну как причем? :) Между прочим GNU C под Виндой эти подчеркивания добавляет (Подчиняется! Под Виндой!), а по крайней мере под Линукс и FreeBSD (POSIX?) - нет. Значит от операционки все таки зависит? :)
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33212347
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да наверно прога на gcc под виндой линкуется с какими-то системными библиотеками отсюда naming conventions.
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33213316
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>псевдослучайно
скажут же))

Имена функций в объектнике генерятся совсем не случайным образом. Каждое имя состоит из имени класса а заодно и списка параметров которые эта функция (метод) юзает. Это имя генерится специфическиским образом в зависимости от компилера. Поэтому если под виндой мы прокомпилим два с++ кода - один на MSVC другой на gcc, то они не слинкуются. Однако, если использовать plain C - всё будет работать на ура.
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33213410
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут как раз речь что на w2k в еxtern "C" (читай plain c) имя функции уродуется -- добавляется подчеркивание.
...
Рейтинг: 0 / 0
Ассемблерные вставки в c++. GNU
    #33213900
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanПоэтому если под виндой мы прокомпилим два с++ кода - один на MSVC другой на gcc, то они не слинкуются. Однако, если использовать plain C - всё будет работать на ура.
... то тоже не слинкуются. Разный формат объектников. :)
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ассемблерные вставки в c++. GNU
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]