----- Original Message -----
From: "Michael Matz"
"xorl %%ecx,%%ecx\n\t" "\n1:\n\t" "movswl (%%esi),%%eax\n\t" "imull (%%edi)\n\t" "addl $2,%%esi\n\t" "addl $4,%%edi\n\t" "addl %%eax,%%ebx\n\t" "adcl %%edx,%%ecx\n\t" "decl %1\n\t" "jnz 1b\n\t" "shrdl $15,%%ecx,%%ebx\n\t" "# sarl $15,%%ecx ! high part unneccessary\n\t" "movl %2,%%eax\n\t" "imull %%ebx\n\t" "movl %%edx,%%eax\n\t" : "=&a" (res) : "o" (res), "i" (0x200000000ULL / FILTLEN), "S" (in), "D" (coeff) : "ax", "bx", "cx", "dx", "si", "di");
Das Ding ist schwierig. Da sind eigentlich zu viele Operanden drin, als dass die alle in die sechs Register von i386 passen wuerden. Deshalb will er den Operand "%1" (der "o" (res)) im Speicher haben. Allerdings geht das dann mit gcc 3.3 wieder schief, da er ein Register benutzt. Man muss den asm ein wenig umstricken, diese Version muesste gehen: __asm__ __volatile__ ("xorl %%ebx,%%ebx\n\t" "xorl %%ecx,%%ecx\n\t" "pushl %%eax\n\t" "\n1:\n\t" "movswl (%%esi),%%eax\n\t" "imull (%%edi)\n\t" "addl $2,%%esi\n\t" "addl $4,%%edi\n\t" "addl %%eax,%%ebx\n\t" "adcl %%edx,%%ecx\n\t" "decl (%%esp)\n\t" "jnz 1b\n\t" "shrdl $15,%%ecx,%%ebx\n\t" "# sarl $15,%%ecx ! high part unneccessary\n\t" "popl %%eax\n\t" "movl %3,%%eax\n\t" "imull %%ebx\n\t" "movl %%edx,%%eax\n\t" : "+a" (res), "+S" (in), "+D" (coeff) : "i" (0x200000000ULL / FILTLEN) : "bx", "cx", "dx");
Und ... wo kann ich mich als Anfänger "einlesen" ?
info gcc / C Extensions / Extended Asm info gccint / Machine Desc / Constraints Ciao, Micha. Muß ich mir mal auf der Zunge zergehen lassen! Vielen Dank! Günther