Как организовать оформление команд в формате AT&T, если в интеловском формате вставка выглядит так: Код (Text): static __inline int first_one(unsigned __int64 bm) { asm { mov eax, dword ptr bm[0] ............. jz f_hi .............. f_hi: bsf eax, dword ptr bm[4] ............ } }
Ну, гагбэ так же. asm ("movl $1, %eax"); // Простейший вариант Многострочный как-то так: asm( "movl %eax, %ecx\n\t" " ещё строка\n\t" :"=r(x)" // Вывод ) Таки да, вывод/ввод тоже тема: int x=10; asm (:"=r(x)"); Справка по синтаксису At&T есть в гугле.
Вопрос тут несколько в другом. Строка Код (Text): "movl %1, %%eax;" грузит в eax младшие 32 бита 64-битного целого. Как же загрузить старшую часть Код (Text): mov eax, dword ptr bm[4] ?
gcc (no __int64) Код (Text): #include<stdio.h> int first_one(long long bm) { int hi; int lo; long long *t; t = &bm; asm( "nop;" "movl (%2), %0;" "movl 4(%2), %1;" "nop;" :"=r"(lo), "=r"(hi) :"r" (t) ); printf("%d %d\n", lo, hi); return 0; } int main() { long long x = 0x000000ff000000feLL; first_one(x); return 0; }