Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: Cheebi am 23. May 2008, 00:25

Titel: gcc inline assembler - %%eax %% - solved
Beitrag 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
Titel: Re: gcc inline assembler - %%eax %%cr0
Beitrag von: bluecode 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.
Titel: Re: gcc inline assembler - %%eax %%cr0
Beitrag von: Cheebi 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
Titel: Re: gcc inline assembler - %%eax %%cr0
Beitrag von: MNemo am 23. May 2008, 15:46
Jetzt wo du eax in der Clobberliste hast hast brauchst du wieder zwei '%'
Titel: Re: gcc inline assembler - %%eax %%cr0
Beitrag von: Cheebi 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
Titel: Re: gcc inline assembler - %%eax %%cr0
Beitrag von: MNemo 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");
Titel: Re: gcc inline assembler - %%eax %%cr0
Beitrag von: Cheebi 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
Titel: Re: gcc inline assembler - %%eax %%cr0
Beitrag von: MNemo am 24. May 2008, 00:50
ich benutze
GNU assembler (GNU Binutils for Debian) 2.18.0.20080103und der Code funktioniert problemlos


Titel: Re: gcc inline assembler - %%eax %%cr0
Beitrag von: Cheebi 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
Titel: Re: gcc inline assembler - %%eax %%cr0
Beitrag von: bluecode 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.
Titel: Re: gcc inline assembler - %%eax %%cr0
Beitrag von: MNemo am 24. May 2008, 17:17
Ich hab ne 64Bit-Version und bekomme ohne '-m32' genau die gleiche Fehlermeldung. Mit '-m32' geht es problemlos.
Titel: Re: gcc inline assembler - %%eax %%cr0
Beitrag von: Cheebi 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