Ассемблерная вставка в формате AT&T

Тема в разделе "LANGS.C", создана пользователем alexander_trofimov, 28 июн 2010.

  1. alexander_trofimov

    alexander_trofimov New Member

    Публикаций:
    0
    Регистрация:
    28 июн 2010
    Сообщения:
    3
    Как организовать оформление команд в формате AT&T, если в интеловском формате вставка выглядит так:
    Код (Text):
    1. static __inline int first_one(unsigned __int64 bm)
    2. { asm { mov  eax, dword ptr bm[0]
    3.          .............
    4.          jz   f_hi
    5.          ..............
    6. f_hi:    bsf  eax, dword ptr bm[4]
    7.          ............  }
    8. }
     
  2. sveta

    sveta SVETA7.0.1-2010

    Публикаций:
    0
    Регистрация:
    12 дек 2008
    Сообщения:
    74
    Ну, гагбэ так же.

    asm ("movl $1, %eax"); // Простейший вариант

    Многострочный как-то так:
    asm( "movl %eax, %ecx\n\t"
    " ещё строка\n\t"
    :"=r(x)" // Вывод
    )
    Таки да, вывод/ввод тоже тема:
    int x=10;
    asm (:"=r(x)");

    Справка по синтаксису At&T есть в гугле.
     
  3. alexander_trofimov

    alexander_trofimov New Member

    Публикаций:
    0
    Регистрация:
    28 июн 2010
    Сообщения:
    3
    Вопрос тут несколько в другом. Строка
    Код (Text):
    1. "movl %1, %%eax;"
    грузит в eax младшие 32 бита 64-битного целого. Как же загрузить старшую часть
    Код (Text):
    1. mov  eax, dword ptr bm[4]
    ?
     
  4. nanoo

    nanoo New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2010
    Сообщения:
    23
    gcc (no __int64)
    Код (Text):
    1. #include<stdio.h>
    2.  
    3. int first_one(long long bm)
    4. {
    5.      int hi;
    6.      int lo;
    7.      long long *t;
    8.      t = &bm;
    9.      asm(
    10.             "nop;"
    11.             "movl (%2), %0;"
    12.             "movl 4(%2), %1;"
    13.             "nop;"
    14.             :"=r"(lo), "=r"(hi)
    15.             :"r" (t)
    16.     );
    17.     printf("%d %d\n", lo, hi);
    18.     return 0;
    19. }
    20.  
    21. int main()
    22. {
    23.     long long x = 0x000000ff000000feLL;
    24.     first_one(x);
    25.     return 0;
    26. }