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.
Sind Sie sicher zwei Doppelpunkte verwendet? ('::') – Jester
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. –
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. –