проблема с ассемблерной вставкой в си

Тема в разделе "LANGS.C", создана пользователем amisd, 17 ноя 2007.

  1. amisd

    amisd New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2007
    Сообщения:
    17
    Код (Text):
    1. void asmfunc(char *m1)
    2. {
    3.    int intmass1[100],l1;//dd=4 byte
    4.    for (i=0;i<=100;i++)        
    5.        *(intmass1+i)=*(m1+i);// m1 - это массив типа char из main(), передаю сюда, как в функцию через указатель
    6. __asm{
    7.        mov eax,'\n' // будем искать символ конца строки(в массиве символы в виде чисел)
    8.        mov ecx,101 //в массиве у нас 101 элемент
    9.        lea edi,intmass1 //вродебы задаём начальный адрес
    10.            cld  //флаг на 0 чтобы с первого до последнего элемента цепочки шёл а не наоборот
    11.        repne scasd      // будем проверять каждый элемент цепочки двойных слов, пока не встретится искомый
    12.        je t1
    13.        jne t2
    14.        t1:
    15.          mov eax,101 // 101 - cx=длина строки
    16.              sub eax,ecx
    17.          mov l1,eax // помещаем длину строки в l1
    18.        t2:
    19.          mov eax,0
    20. }
    21.     printf("l1=%d;\n",l1);
    22. }
    23. int main()
    24. {
    25.   char charmass1[100];
    26.   printf("input:\n");
    27.   scanf("%s",&charmass1);
    28.   asmfunc(charmass1);
    29.   system("pause");
    30.   return 0;
    31. }
    ввожу asd мне выводит l1=49 в любом случае, при любой длине строки
    !?
     
  2. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    А как ты вводишь данные в intmass1?
     
  3. amisd

    amisd New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2007
    Сообщения:
    17
    CnCVK
    код не весь кинул просто) сейчас исправлю, в главной функции scanfом, но это ничего не меняет
     
  4. super1w

    super1w New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2007
    Сообщения:
    3
    amisd
    Там у тебя две ошибки
    *(intmass1+i)=*(m1+i); здесь происходит запись в 101й элемент массива, а размер массива 100, замени for (i=0;i<=100;i++) на for (int i=0;i<100;i++)
    mov eax,'\n' а здесь ты ищешь то чего нет, замени на xor eax,eax
     
  5. amisd

    amisd New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2007
    Сообщения:
    17
    я ищу '\n' - этот символ = 10 в числовом эквиваленте, почему его там нет? есть он там, и зачем очищать регистр eax?
     
  6. super1w

    super1w New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2007
    Сообщения:
    3
    Ну ты хоть бы прочитал как работает scanf с параметром %s - копируется строка до первого встретившегося знака пробела, таб или \n, и к этой строке добавляется ноль, поэтому искать надо ноль а не \n.
     
  7. amisd

    amisd New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2007
    Сообщения:
    17
    super1w
    точняк) только не 0 а '\0'
     
  8. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
  9. ltshck

    ltshck New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    195
    вопрос по примеру.
    как откомпилировать это в MinGW g++ ?

    на

    __asm {
    }

    ругается.

    %mov , %eax писать не вариант.


    компилировать через VC тоже не вариант.
    как сделать на MinGW ?
     
  10. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    ltshck
    никак