Hallo,
ich bin jetzt auf ein neues Problem beim Inline-Assembler gestoßen. Im Assembler-Code ist ein Block drin der oft wiederholt wird. Wenn die Anzahl der Wiederholungen eine gewisse Größe überschreitet (z.B. 400) dann meldet der Assembler einen Fehler "bad immediate value for offset(4980)".
1. Frage: Wie kommt das und wie kann man es verhindern? Muss ich dem C-Compiler noch irgendwie mitteilen wie lang der Inline-Assembler-Code ist?
2. Frage: Ich meine dass ich in diesem Fall keine Clobber-List brauche, weil außer den bereits deklarierten Variablen i1, i2 und sad nichts verändert wird. Ist das richtig?
3. Frage: Die Zeiger ptr1 und ptr2 sind als Eingänge deklariert, werden allerdings auch durch den Code verändert. Ist das so richtig, oder müsste ich sie auch als Ausgänge deklarieren?
Gruß
Michael
#include <stdio.h>
int main(void)
{
unsigned char array[1000000];
int i;
for(i=0; i < 1000000; i++)
array[i] = 0;
int i1, i2;
int sad = 0;
asm volatile(
"ldr %[i1], [%[ptr1]], #+4" "\n\t"
"ldr %[i2], [%[ptr2]], #+4" "\n\t"
"usad8 %[sad], %[i1], %[i2]" "\n\t"
".rept 400" "\n\t"
"ldr %[i1], [%[ptr1]], #+4" "\n\t"
"ldr %[i2], [%[ptr2]], #+4" "\n\t"
"usada8 %[sad], %[i1], %[i2], %[sad]" "\n\t"
".endr" "\n\t"
: [i1] "=&r" (i1), [i2] "=&r" (i2), [sad] "=&r" (sad)
: [ptr1] "r" (&array[20]), [ptr2] "r" (&array[80])
);
printf("sad: %d\n",sad);
}
Alles anzeigen