Fehler: unmöglich, registrieren Einschränkung in 'asm'
Ich habe ein problem beim kompilieren eines Pakets um, ich bin nicht
wirklich ein guter coder, aber ich habe versucht Festsetzung es für mein selbst, und es immer noch nicht kompilieren.
Dies ist der original-bit-code.:
#ifdef __GNUC__
asm("and $3, %%ecx;"
"shl $3 ,%%ecx;"
"ror %%cl, %0"
: "=r" (value)
: "r" (value), "c" (address));
#else
Der Fehler ist .:
GBAinline.h:139: Fehler: unmöglich, registrieren Einschränkung in 'asm'
( ifdef Zeile 138 )
Und dies ist, wie ich versucht, um es so Aussehen.:
#ifdef __GNUC__
asm ("and $3 %%ecx,shl $3 %%ecx,ror %%cl, %0" : "=r" (value): "r" (value), "c" (address));
#else
Immer noch, es würde nicht funktionieren. Es ist ein gba-emulator, bevor jemand fragt, VBA, und dies ist
Teil GBAinline.h . Dieser assembler ist macht mich verrückt bereits.
Bearbeiten.: Das problem wurde oben behandelt, fein, ich hatte einfach nicht die Aufmerksamkeit auf die
compiler und ich war mit.
Aber jetzt bekomme ich diesen Fehler auf dieses Stück code aus einer header-Datei, ich habe Sie auf pastebin,
um die Dinge hier ein bisschen mehr aufgeräumt... ( Sorry, wenn dies falsch ist, ich kann das ändern später )
Dies ist der header, hat die Linien, dass führt zu Fehlern.:
http://pastebin.com/k3D4cg0d
- Und das ist die C-Datei es sich bezieht.:
http://pastebin.com/Ymg1X5dg
Das gibt eine Fehlermeldung.:
/var/tmp/cc3zA0lH.s: Assembler messages: /var/tmp/cc3zA0lH.s:69: Error: bad instruction `sw $3,0(r3)',
Und so weiter für den rest dieser Zeilen.
gcc -v
Ausgang? Sie benötigen, um mit x86 Assembler und gcc-inline-assembly-constraints, um vollständig zu verstehen, diesen code.Danke für die Antwort Mackie, meine gcc-arm-linux, vielleicht ist das problem, dieser code ist speziell für x86, und ich es nicht bemerkt. Vielen Dank auch für den link, ich werde geben ihm eine gute look.
Also, ich habe einen x86-compiler, und es funktionierte wie ein Charme! Danke Mackie, ich hatte nicht darauf geachtet.
Sie sind herzlich willkommen. Wenn Sie wirklich wollen, um zu Tauchen, in inline assembly mit gcc und x86 - dieser Anleitung ist eine sanfte Einführung.
InformationsquelleAutor Luis | 2011-12-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dass inline-Montage ist buggy:
\n
alle angezeigt auf einer Linie. Ob Ihr assembler akzeptiert - Anweisungen, getrennt durch Semikolons, die den Unterschied macht es ... einige können nicht."+r"(value)
als gewöhnlich vorgeschlagen, für diese situation.Ohne dass der rest des Codes ist es nicht ganz klar, warum die inline-assembly-Anweisung sieht wie es funktioniert; ich Persönlich würde vorschlagen, es zu schreiben wie:
da es wenig Notwendigkeit zu tun, die Berechnung selbst in der Montage. Die
uintptr_t
(aus<stdint.h>
) cast macht dieser 32 - /64-bit Agnostiker auch.Edit:
Wenn Sie wollen, dass es für eine verschiedenen CPU aber x86 /x64, dann es muss natürlich anders sein ... Für ARM (nicht Thumb2), wäre es:
da, das ist wie das drehen-Einweisung dort verhält.
Bearbeiten (Verweis hinzufügen):
Bezüglich der operation, die hier als solche, in diesem blog-post gibt eine interessante Perspektive - nämlich, dass der compiler ist sehr wahrscheinlich, um dieselbe Ausgabe für:
als für die x86-inline -
Testen:
Kompilieren /zerlegen:
Ergo inline-Montage unnötig ist.
sieht aus wie eine MIPS-Instruktion, nicht x86-oder ARM. Sie müssen konfigurieren Sie Ihre Umgebung richtig...
ack, sieht aus wie eine cross-compile-setup-problem; Luis, wie haben Sie Ihr Kreuz Umfeld ?
Schön finden.
du meinst, auf das makefile? es ist CC=$(CROSS_COMPILE)gcc ( mit der richtigen Leerzeichen natürlich ) Sorry für die Verzögerung auf die Antwort. @ Mackie, ich noch müssen Sie konfigurieren die Umgebung? Vielen Dank Euch beiden, ich fügte hinzu, mehr Informationen auf meine OP.
InformationsquelleAutor FrankH.