Вот такая бага у меня:
есть прога:
#include <stdlib.h>
#include <stdio.h>main (int argc, char *argv[])
{
__asm__ __volantile__{ тут код на асме}
return 0;
}а вот что говорит компилятор:
%gcc -o cfile cfile.c
cfile.c: In function `main':
cfile.c:6: error: syntax error before "__volantile__"
%
Как быть? Прога под фрю... Кто знает как сделать асмовую вставочку в С под юникс?
__asm__ __volatile__ ( ...... );
__asm__ ( ..... );
asm ( ... );
>__asm__ __volatile__ ( ...... );
%gcc -o cfile cfile.c
cfile.c: In function `main':
cfile.c:6: error: syntax error before ')' token
%>__asm__ ( ..... );
%gcc -o cfile cfile.c
cfile.c: In function `main':
cfile.c:6: error: syntax error before ')' token
%>asm ( ... );
%gcc -o cfile cfile.c
cfile.c: In function `main':
cfile.c:6: error: syntax error before ')' token
%Не работает хоть убей ! :(((
Кто нибудь может привести рабочий пример под фрю? Буду очень и очень благодарен...
Мне бы просто понять как асм в С вставлять, а там я уже разберусь...
#include <stdio.h>unsigned long summa(unsigned long A, unsigned long B)
{
unsigned long rez;
asm(
" addl %Мx, %Йx \n"
: "=a"(rez)
: "a"(A),"d"(B)
);return rez;
}int main()
{
unsigned long A, B, C;
A = 3;
B = 2;
C = 0;
printf("C - %u\n", C);
C = summa(A, B);
printf("C - %u\n", C);return 0;
}
Гораздо лучше сделать отдельный файл на ассемблере, заголовочный файл, описывающий функции в нем и соединять их при линковке. Причина - облегчение переноса программ на другие платформы. Вот представь, приспичило тебе перенести твою чудо программу ну, скажем, на процессор ARM. И ты добросовестно сидишь и выковыриваешь из исходников команды x86 и заковыриваешь туда команды ARM. В результате у тебя два исходника, и каждый из них нужно поддерживать. Нахрен такой гемор? А так все ассемблерные функции у тебя в отдельном файлике - сделал новый под другую архитектуру и все проблемы решены.
Вообще, в целях повышения переносимости, лучше все платформо-зависимое валить в одну кучу, а все независимое - в другую. Меньше будет проблем и у программистов, и у их жертв :)