Autor Thema: gcc inline assembler - %%eax %% - solved  (Gelesen 8630 mal)

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« 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
« Letzte Änderung: 25. May 2008, 02:29 von Cheebi »
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 23. May 2008, 06:16 »
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.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #2 am: 23. May 2008, 15:10 »
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
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 23. May 2008, 15:46 »
Jetzt wo du eax in der Clobberliste hast hast brauchst du wieder zwei '%'
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #4 am: 23. May 2008, 22:59 »
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
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 23. May 2008, 23:45 »
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");
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #6 am: 24. May 2008, 00:03 »
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
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 24. May 2008, 00:50 »
ich benutze
GNU assembler (GNU Binutils for Debian) 2.18.0.20080103und der Code funktioniert problemlos


„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #8 am: 24. May 2008, 15:28 »
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
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #9 am: 24. May 2008, 15:44 »
Ja

gcc --v:
Zitat
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:
Zitat
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.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 24. May 2008, 17:17 »
Ich hab ne 64Bit-Version und bekomme ohne '-m32' genau die gleiche Fehlermeldung. Mit '-m32' geht es problemlos.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #11 am: 25. May 2008, 02:29 »
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
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

 

Einloggen