|
|
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
Привет всем. Я вот тут пытаюсь ассемблерную вставку в с++ запихнуть... А не получается. Точнее получается... Но как - то криво. Пишу просто для пробы: ... 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 '*' Но работает. Но что значит это предупреждение? Как от него избавиться? Я просто не понимаю, что имеется ввиду. Что не есть гут. Объясните пожалуйста, что это значит, и как от этого избавиться. И (если они есть) другие способы вызова функций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2005, 19:45 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
TnedutSПишет мне undefined reference to printab Ну так объяви саму функцию. Хотя бы через void printtab(void); в начале модуля а потом уже и ассемблерные вставки могут быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2005, 19:58 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
Так я объявил же... void printab(int ); ... int x1 = 1; asm("pushl %0\n\tcall printab \n\tpop %%eax" : : "r" (x1)); ... void printab(int a) { ... } Или что-то другое имеется ввиду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2005, 20:08 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
ниче не понил. но все равно что-нибудь скажу. может так Код: plaintext 1. или Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2005, 20:13 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
ну это я просто видел в других OS подобную хрень... типа extern "ASM", extern "OS", #pragma linkage( OS, ... ) .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2005, 20:16 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
NewYearниче не понил. но все равно что-нибудь скажу. может так Код: plaintext 1. или Код: plaintext 1. Как было, так и осталось... "undefined reference" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2005, 20:18 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
White Owl TnedutSПишет мне undefined reference to printab Ну так объяви саму функцию. Хотя бы через void printtab(void); в начале модуля а потом уже и ассемблерные вставки могут быть. Я все функции, которые создаю в начале модуля объявляю. И эта тоже в объявлениях есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2005, 20:21 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
TnedutSЯ все функции, которые создаю в начале модуля объявляю. И эта тоже в объявлениях есть. Не скажу, что собака тут порылась... Но как вариант... Обычно азм различает дальнии и ближнии переходы. Обычно делает это он, на автомате, если не указано явно. Попробуйте сам код подпрограммки расположить поближе от ассемблерной вставки. с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 12:34 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
И ещё одна мысля... Сделайте для начала чиссо азмовскую метку. Попробуйте позвать её. Далее станет понятно - что хромает. Обьявление или что то ышо. с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 12:36 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
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)*/); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 13:05 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
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)); ... Замечательный вечный цикл получился. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 13:07 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
Похоже, придется ограничиться "кривым" способом. Хоть работает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 13:17 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
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. Попытался сделать это подобным образом asm("pushl %0\n\tcall %1 \n\tpop %%eax" : : "r" (x1),"r"(printab)); Пишет предупреждение indirect call without '*' Но работает. Но что значит это предупреждение? Как от него избавиться? Я просто не понимаю, что имеется ввиду. Что не есть гут. Объясните пожалуйста, что это значит, и как от этого избавиться. И (если они есть) другие способы вызова функций. Если смотреть ассемблерный листинг, то в данном случае адрес printab помещается в eax (потому и не ругается на неизвестное имя ), затем происходит вызов call %eax, в первом же случае происходит вызов call printab напрямую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 14:33 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
#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); Не работает.... Не понимаю. Один в один скопировал - не пашет. Может, в версии компилятора дело? Кстати, на счет придания смысла. Дело в том, что все делается ради того, чтобы сначала загнать в стек параметры, а потом вызвать какую-то постороннюю функцию. Вот и тренируюсь на кошках. А тут сама себя она вызывает как-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 15:18 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
У меня gcc 3.3.3 Может, в этом дело? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 15:24 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
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 имя_файл ассемблерный листинг и изучить его. Кстати, на счет придания смысла. Дело в том, что все делается ради того, чтобы сначала загнать в стек параметры, а потом вызвать какую-то постороннюю функцию. Вот и тренируюсь на кошках. А тут сама себя она вызывает как-то. Да что она делает я понял, я не понял зачем тут бесконечная рекурсия (стек завалить чтоль) и передача мусора в качестве параметра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 15:33 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
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. Не уверен, что мне это сейчас поможет. У меня очень мало опыта с асмом. Да и вообще в общем, надо сказать. Я даже не знаю, что именно мне надо в листинге искать. Можно подсказать, что надо искать? Я могу попробовать, но боюсь,правда, тогда ничего не успею... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 16:18 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
Операционка 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++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 16:27 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
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 Та ж фигня ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 16:43 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
Менять g++? Или есть еще варианты? Или во всем виноват Билл Гейтс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 16:50 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
И, наконец, если кому интересно, решение! 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(;;); } Спасибо всем! И еще куче народу на других форумах:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 18:36 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 23:02 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
White Owl На самом деле это не Win. Это стандарт компиляторов С. Это точно стандарт? Ссылку можно? (Вопрос для меня непринципиальный, поэтому самому искать ответ лень) Может быть это не стандарт, а типа соглашения компиляторов под Вин? Потому как под Линуксом по умолчанию никаких подчеркиваний впереди не добавляется - или там стандарт нарушают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2005, 10:54 |
|
||
|
Ассемблерные вставки в c++. GNU
|
|||
|---|---|---|---|
|
#18+
Ага. Буду знать. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2005, 11:25 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33207737&tid=2032901]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
61ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 415ms |

| 0 / 0 |
