Помогите со вставками асма в Си код.

Тема в разделе "WASM.UNIX", создана пользователем fray, 14 июн 2007.

  1. fray

    fray New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2007
    Сообщения:
    1
    В винде я делал так ,
    Код (Text):
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. #define SIZE 1024
    5.  
    6. int main()
    7. {
    8.     char **HTML;
    9.     HTML=(char **)malloc(SIZE);
    10.     HTML[0]="AAAAAAAAA\n";
    11.     HTML[1]="BBBBBBBBBBB\n";
    12.     HTML[2]="CCCCCCCCCCCCC\n";
    13.     HTML[3]="DDDDDDDDDDDDDDD\n";
    14.     HTML[4]=NULL;
    15.     char **fullstr1, **fullstr2;
    16.     fullstr1=(char **)malloc(SIZE);
    17.     memset(fullstr1,0x00,SIZE);
    18.     fullstr2=fullstr1;
    19.     int n=0;
    20.       while(*HTML !=NULL)
    21.       {
    22.         memcpy(fullstr1, *HTML,strlen(*HTML));
    23.         n=(int)strlen(*HTML);
    24.         _asm
    25.         {
    26.             mov         eax,dword ptr [n]
    27.             mov         ecx,dword ptr [fullstr1]
    28.             lea         edx,[ecx+eax]
    29.             mov         dword ptr [fullstr1],edx
    30.         }
    31.         *HTML++;
    32.       }
    33.       printf("%s\n",fullstr2);
    34.       return 0;
    35. }
    Хотелось бы тоже воспроизвести во FreeBSD ! Мож кто умеет ?
    Да и еще один вопрос, как прикомпиливать .asm функции в gcc к собственно основной программе.
     
  2. GanDJuStas

    GanDJuStas New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2003
    Сообщения:
    21
    Адрес:
    Russia
    а написать fullstr1+=n не судьба?
     
  3. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Код (Text):
    1.     __asm__(
    2.         "leal (%%ecx, %%eax, ), %%edx"
    3.         : "=d" (fullstr1) : "a" (n), "c" (fullstr1)
    4.     );
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    fray
    Хмм... А зачем в данном случае использовать ассемблерную вставку?

    Не понял. Как оформить ассемблерную вставку в виде отдельной функции или как?
     
  5. kamatoz

    kamatoz New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2004
    Сообщения:
    31
    Адрес:
    Russia
    тоже спрошу, была проблема. Как в с файле оформить отдельную функцию на асме, чтоб компилер не генерил собственный пролог к функции, - аналог _declspec(naked) в винде.
     
  6. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Разве стандартный 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 понял число а не адрес).
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    xlinuks
    Последние версии GAS'а поддерживают интеловский формат, но в инлайновых вставках GCC их, вроде, ещё нельзя использовать. В любом случае AT&T формат имеет некоторые преимущества над интеловским: легко адаптируется под любые процессоры, более портабелен (хотя применительно к ассемблеру это не имеет особого смысла, но всё же), менее двусмысленен. AT&T формат рулит!

    kamatoz
    Нет такого аналога. Зато можно запросто оформить функцию в отдельном ассемблерном исходнике, собрать в обьектник и прилинковать к основному модулю GCC. Всё это можно автоматизировать через Makefile.