Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Cheebi am 23. May 2008, 00:25
-
hi,
warum gibt der gnu assembler 2.18.0 bei folgendem code die nachfolgenden fehlermeldung aus?
__asm__("movl %%cr0, %%eax\n\t"
"or $0x80000000, %%eax\n\t"
"mov %%eax, %%cr0\n\t"::);
fehlermeldung:
gcc -ffreestanding -c -O3 -o mem.o mem.c
/tmp/ccIHvtLl.s: Assembler messages:
/tmp/ccIHvtLl.s:21: Error: suffix or operands invalid for `mov'
/tmp/ccIHvtLl.s:23: Error: suffix or operands invalid for `mov'
make: *** [compile] Fehler
wohingegen dieser code anstandslos übersetzt wird:
__asm__("mov %0, %%cr3\n\t"::"r" (value));
gruß Cheebi
-
Wenn du in der Input/Output Liste was stehen hast, dann brauchst du bei den Registern zwei Prozentzeichen. Falls da nichts steht nur eins. Ich würde übrigens asm volatile empfehlen, um sicher zu gehen, dass der Compiler nicht einfach das Zeuch rausnimmt oder woanders hinschiebt. Im ersten Code solltest du übrigens eax in die Clobberlist packen, damit der Compiler sich nicht wundert, dass eax einen anderen Wert hat.
-
hm.. danke für die schnelle antwort, aber der fehler ist nicht behoben. der code sieht nun so aus:
__asm__ volatile ("mov %cr0, %eax\n\t"
"or $0x80000000, %eax\n\t"
"mov %eax, %cr0\n\t":::"eax");
und die fehlermeldung:
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
das verrückte ist ja, dass der ursprüngliche code mit djgpp unter windows compilierte. nur die linux-gcc-version streikt.
hilfe
Cheebi
-
Jetzt wo du eax in der Clobberliste hast hast brauchst du wieder zwei '%'
-
hm.. nö.. bei mir irgendwie nicht weil sonst erfolgen wieder mehrere fehler
__asm__ volatile ("mov %cr0, %eax\n\t"
"or $0x80000000, %eax\n\t"
"mov %eax, %cr0\n\t":::"eax");
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
gruß
Cheebi
ps: ich nutze version 2.18.0 von gnu-as
-
hm.. nö.. bei mir irgendwie nicht weil sonst erfolgen wieder mehrere fehler
__asm__ volatile ("mov %cr0, %eax\n\t"
"or $0x80000000, %eax\n\t"
"mov %eax, %cr0\n\t":::"eax");
das ist doch auch immer noch der gleiche Code
so habe ich das gemeint:
__asm__ volatile ("mov %%cr0, %%eax\n\t"
"or $0x80000000, %%eax\n\t"
"mov %%eax, %%cr0\n\t":::"eax");
-
ach sh**... sry.. hab natürlich schon verstanden was du meintest und auch ausprobiert nur iwie falsch gecopy-pasted...
fehler sind eben wieder die von anfang:
/tmp/cccp1RHB.s:655: Error: suffix or operands invalid for `mov'
/tmp/cccp1RHB.s:657: Error: suffix or operands invalid for `mov'
und dieses mal auch den richtigen code rein kopiert:
__asm__ volatile ("mov %%cr0, %%eax\n\t"
"or $0x80000000, %%eax\n\t"
"mov %%eax, %%cr0\n\t":::"eax");
das interessante ist, dass ich diesen fehler auch bei der zeile hatte:
__asm__ volatile("movl %0, %%cr3\n\t"::"r" (value));
da musste ich aus movl dann nur mov machen und schwupps akzeptierte er es.
bei dem zweiten problem hilft das alles nichts.. hängt wohl mit dem spezial regeister cr0 zusammen...
welche version von as nutzt ihr denn?
Cheebi
-
ich benutze
GNU assembler (GNU Binutils for Debian) 2.18.0.20080103
und der Code funktioniert problemlos
-
hm... also ich weiß auch nicht... könnt ihr folgendes ohne fehlermeldung copilieren?
test.c:
// test.c
int main()
{
__asm__ volatile ("mov %%cr0, %%eax\n\t"
"or $0x80000000, %%eax\n\t"
"mov %%eax, %%cr0\n\t":::"eax");
return 0;
}
shellbefehl:
gcc -ffreestanding -c -o test.o test.c
weil das kann ich bei mir nicht compilieren. sollte es bei euch gehen, muss ich mich nach nem anderen assembler umsehen.
Cheebi
-
Ja
gcc --v:
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)
ld -v:
GNU ld (GNU Binutils for Ubuntu) 2.18.0.20080103
Du hast schon ein 32bit System oder? Sonst brauchst du auf jeden Fall -m32, aber du solltest sowieso einen crosscompiler brauen.
-
Ich hab ne 64Bit-Version und bekomme ohne '-m32' genau die gleiche Fehlermeldung. Mit '-m32' geht es problemlos.
-
ohjeeeeee... VIELEN DANK...
wer kommt denn auch darauf, dass windoofs halt keine 32-bit-version war... das ubuntu, das ich jetzt nutze, aber doch.. es geht jetzt... ich weiß schon warum ich euch liebe :-D
danke
Cheebi