2016-04-11 24 views
-2

Ich versuche, die Syntax des Schreibens in Assembly zu verstehen, um zuerst den Code korrekt und zweitens effizient zu schreiben. in diesem Beispiel zeigt es das Beispiel mit "=r":: "r" vs: "= r" Versammlung Klarstellung

asm volatile ("MRS %0, PMUSERENR_EL0\n": "=r"(value)); 

dies den Wert des Registers und speichert sie in der Wertvariable liest. Das andere Beispiel verwendet ::"r"

asm volatile ("MSR PMUSERENR_EL0, %0\n":: "r"(value)); 

Dieser Wert Variable in die PMUSERENR_ELO Register schreibt. Hier ist ein weiteres Beispiel: How to measure program execution time in ARM Cortex-A8 processor?.

Wenn ich einen einfachen Test-Code mit den beiden oben genannten Befehle zu kompilieren versuchen, erhalte ich die Fehlermeldung: :9:2: error: output operand constraint lacks '=' Wenn ich die „=“ Hinzufügen und Entfernen von einem „:“ es wird kompilieren, aber wenn ich es testen, heißt es einfach Illegal instruction

Wenn jemand bitte den Unterschied erklären könnte, der hilfreich wäre, zeigen zahlreiche Montageanleitungen das gleiche Format, aber keine Erklärung. Es ist auf einer 64-Bit-Arm-Plattform, wenn das irgendwelche Einblicke bietet. Vielen Dank.

+0

Sind Sie sicher zwei Doppelpunkte verwendet? ('::') – Jester

+0

Siehe [diese Sammlung von Links zu GNU C inline asm] (http://stackoverflow.com/questions/34520013/using-base-pointer-register-in-c-inline-asm/34522750# 34522750), einschließlich der Links zu [der offiziellen gcc-Dokumentation] (https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html), die Eingabe- und Ausgabe-Constraints erläutern. –

+0

Dies ist keine Assembly Dies ist Inline-Assembly, die für einen Compiler spezifisch ist, im Grunde ist dies eine C/C++ - Frage, keine Assembly-Frage. –

Antwort

1

Konnten Sie die Antwort in diesem Buch: https://books.google.com/books?id=Bl0_hWV20TAC&pg=PA370&lpg=PA370&dq=two+colon+%22::%22+in+assembly+language&source=bl&ots=Ha8EkNUJee&sig=p6v6iPOCYjBJdmBBVx2ZdxoRT2I&hl=en&sa=X&ved=0ahUKEwj8xcOElYnMAhVQ_WMKHR-JC7IQ6AEIRjAH#v=onepage&q=two%20colon%20%22%3A%3A%22%20in%20assembly%20language&f=false

If no output values are associated with the assembly code, the section must be blank, but two colons must still separate the assembly code from the input operands.

Der Grund ist, weil das der Standard ist. Ein Doppelpunkt für Ausgaben und zwei für Eingaben.