2010-03-10 11 views
5

Bei dem Versuch, mein Projekt zu kompilieren, dass einige Drittanbieter-Header verwendet, mit mingw 4.4, begegnete ich die folgenden Fehler:Was bedeutet "__asm ​​__ (". Previous "); ' bedeuten?

:

Assembler messages:
Error: junk at end of line, first unrecognized character is '"'
Error: unknown pseudo-op: '.previous'

ich diesen Code am Ende eines des mitgelieferten Header gefunden

__asm__(".section \".plc\""); 
__asm__(".previous"); 

Da ich keinerlei Erfahrung mit In-Line-Assembler-Anweisungen habe, habe ich nach einer Erklärung gegoogelt, konnte aber keine Antwort auf meine zwei grundlegenden Fragen finden. Was macht __asm__(".previous"); wirklich und warum würde jemand dies am Ende einer Header-Datei setzen.

Dies sind die einzigen __asm__ Anweisungen im gesamten Projekt. Kann ich sie sicher löschen? Oder gibt es eine Möglichkeit, .previous zu definieren, um es zu einem bekannten Pseudo-Op zu machen?

Erleuchte mich, bitte!

Antwort

4

.previous ist eine Anweisung, mit der Sie zwischen zwei Elf-Abschnitten hin- und herwechseln können. Es ist eine Verknüpfung, die dichtere Assembly-Dateien ermöglicht und es Ihnen beispielsweise ermöglicht, initialisierte Daten in einem Code-Stream zu deklarieren oder umgekehrt.

Zum Beispiel sagen Sie, Sie haben eine Assembler-Datei mit einem Daten-und einem Code-Abschnitt.

Wenn Sie wollen - in der Mitte einer Funktion - eine Konstante im Datensegment erklären Sie die .previous Anweisung wie folgt verwendet werden:

nop   // some code 

.previous  // swaps current section (code) with previous section (data) 

MyConstant: 
    .word 0x0001 // some data 

.previous  // swaps curent section (data) with previous section (code) 

    nop   // more code 

Weitere Informationen finden Sie im Referenzhandbuch zu finden:

http://sourceware.org/binutils/docs-2.19/as/Previous.html#Previous

+1

Da gibt es keine Anweisungen nach "__asm ​​__ (". Vorherige ");" in meinem Codebeispiel deklariert es einfach einen neuen Abschnitt ".plc" und tauscht einen leeren Code ein. Ist das richtig? Das Löschen hätte also keine Auswirkungen auf die kompilierte Anwendung. – NullAndVoid