В винде я делал так , Код (Text): #include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 1024 int main() { char **HTML; HTML=(char **)malloc(SIZE); HTML[0]="AAAAAAAAA\n"; HTML[1]="BBBBBBBBBBB\n"; HTML[2]="CCCCCCCCCCCCC\n"; HTML[3]="DDDDDDDDDDDDDDD\n"; HTML[4]=NULL; char **fullstr1, **fullstr2; fullstr1=(char **)malloc(SIZE); memset(fullstr1,0x00,SIZE); fullstr2=fullstr1; int n=0; while(*HTML !=NULL) { memcpy(fullstr1, *HTML,strlen(*HTML)); n=(int)strlen(*HTML); _asm { mov eax,dword ptr [n] mov ecx,dword ptr [fullstr1] lea edx,[ecx+eax] mov dword ptr [fullstr1],edx } *HTML++; } printf("%s\n",fullstr2); return 0; } Хотелось бы тоже воспроизвести во FreeBSD ! Мож кто умеет ? Да и еще один вопрос, как прикомпиливать .asm функции в gcc к собственно основной программе.
fray Хмм... А зачем в данном случае использовать ассемблерную вставку? Не понял. Как оформить ассемблерную вставку в виде отдельной функции или как?
тоже спрошу, была проблема. Как в с файле оформить отдельную функцию на асме, чтоб компилер не генерил собственный пролог к функции, - аналог _declspec(naked) в винде.
Разве стандартный GCC может компилить "mov ecx,dword ptr [fullstr1]" ? Если я не ошибаюсь (на линуксе) для inline assembly instructions gcc требует только теги в стиле AT&T (have a look at the "as" compiler). Например чтобы поставить число размером в 4 байта в eax (например цифру 1) нужно написать "movl $1, %eax" ("movl" - потому что move long, "$1"=чтобы assembler понял число а не адрес).
xlinuks Последние версии GAS'а поддерживают интеловский формат, но в инлайновых вставках GCC их, вроде, ещё нельзя использовать. В любом случае AT&T формат имеет некоторые преимущества над интеловским: легко адаптируется под любые процессоры, более портабелен (хотя применительно к ассемблеру это не имеет особого смысла, но всё же), менее двусмысленен. AT&T формат рулит! kamatoz Нет такого аналога. Зато можно запросто оформить функцию в отдельном ассемблерном исходнике, собрать в обьектник и прилинковать к основному модулю GCC. Всё это можно автоматизировать через Makefile.