2016-11-18 3 views
1

Ich versuche Inline-Assembly-Code unter Verwendung von Nano-Textdatei unter Linux zu konvertieren.GCC-Inline-Assembly-Fehler

__asm__ ("MOV AX, morales1\n\t" 
     "MOV BX, morales2\n\t;" 
     "ADD AX, BX\n\t;" 
     "MOV morales, AX;" 
     ); 

Mit Morales 1 und 2 unterzeichnet Shorts. Ich bekomme den folgenden Fehler:

"Error: ARM register expected -- mov AX,morales1'"`

+1

Arbeiten Sie an einem ARM-Chip? Sie möchten die Dokumentation für die Chip-Architektur, die die gültigen Registernamen zur Verfügung stellt. AX ist möglicherweise nicht für die angegebene Zielarchitektur geeignet. Sie können hier beginnen: http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001m/QRC0001_UAL.pdf –

+1

ARM-Prozessoren benötigen ARM-Assemblercode, nicht x86-Assemblercode. –

+0

ja ich bin. Ich arbeite mit einem Raspberry Pi. Das Format ist also falsch? Wie die Register? – Brian

Antwort

0

Sie scheinen ein wenig unscharf auf, was ein Compiler tut. Im einfachsten Fall nimmt ein c-Compiler Dateien mit c-Anweisungen und konvertiert sie in Assemblersprachanweisungen, die für die Ausführung auf einem bestimmten Prozessor geeignet sind.

Aber es gibt viele Prozessoren da draußen, und jede Familie von Prozessoren verwenden unterschiedliche Montageanweisungen. Wie kann ein C-Compiler damit umgehen? Die Antwort ist, dass ein bestimmter Compiler (typischerweise) nur ein einziges Ausgabeformat unterstützt. So haben Sie vielleicht einen Compiler, der Code für x86 ausgibt, einen anderen x64, einen für ARM, MIPS usw. Während alle eine c-Eingabedatei verwenden, geben sie jeweils die entsprechenden Assembler-Anweisungen für ihr Ziel aus.

Dies bedeutet, dass reguläre c Anweisungen (case, break, printf, scanf, etc.) der Compiler für Sie in den entsprechenden Assembler übersetzen kann. Wenn Sie jedoch die Anweisung asm verwenden, weisen Sie den Compiler an, keine c-> Assembler-Übersetzung durchzuführen. Es muss genau die spezifischen Assembleranweisungen ausgeben, die Sie bereitstellen.

Was hat das alles mit Ihrer Frage zu tun?

Was passiert, wenn Sie die Assembler-Anweisungen von einer Plattform (sagen wir x86) nehmen und versuchen, sie auf einer anderen Plattform zu verwenden (sagen wir ARM)? Nun, meistens passiert es, dass es nicht funktioniert. (Als ein fiktives Beispiel) Wenn Sie versuchen, add x, y zu verwenden und der Prozessor u32.xadd x, x, y erwartet, wird es wirklich verwirrt, und behandeln Sie einfach Ihren Assembler als Unsinn.

Also, wie "fixieren" Sie das? Nun, der vernünftigste Plan wäre, zu versuchen, die Assemblersprache in Ihrem c-Code zu verwenden. Es sieht so aus, als ob du nur zwei Zahlen hinzufügen willst. c hat bereits Anweisungen, die das tun können.

Um zu betonen: C-Code schreiben und den Compiler-Ausgabe-Code ist fast immer der bessere Ansatz. Wenn Sie versuchen, die Inline-Assemblierung zu verwenden, müssen Sie die Sprache c, die Assemblersprache für Ihren Zielprozessor und die Schnittstellenregeln zwischen den beiden, die der jeweilige Compiler verwendet hat, kennen (jeder Compiler scheint dies etwas anders zu machen). Das ist eine Menge zu wissen und versuchen, richtig zu machen. Und (wie Sie entdeckt haben) macht es den Übergang von einem Compiler/Prozessor zu einem anderen schmerzhaft.

Aber wenn Sie unbedingt müssen Assembler verwenden, müssen Sie mit dem Erlernen der Assembler Anweisungen für Ihren Prozessor beginnen. Eine Google-Suche sollte eine Vielzahl von Ressourcen für diese Anweisungen anzeigen. Sobald Sie das gelernt haben, können Sie Ihren asm Befehl aktualisieren, um die richtigen Anweisungen zu enthalten.