-> Definiert das Makro mfmsr (move from machine status register)
-> Definition einer temporären Variable
-> Jetzt kommt Inlineassemblercode.
-> Der Compiler darf den nachfolgenden Assemblercodeabschnitt nicht
wegoptimieren oder ihn aus einer Schleife vor die Schleife
verschieben.1 | "mfs\t%0,rmsr\n" : "=d"(_rval) \
|
-> Beschreibung des zu generierenden Assemblercodes
-> Pattern für Assemblerbefehl. Für %0 wird etwas eingesetzt, was
nach dem Doppelpunkt genauer spezifiziert wird.
-> move from special purpose register
-> register "machine status register"
-> Spezifikation dafür, was für %0 eingesetzt werden soll
-> Gibt an, dass %0 ein Output ist.
-> Gibt an, dass %0 ein General-Register sein soll. Der Compiler
wird also für %0 eines der Register r0—r31 einsetzen.
-> In dieser C-Variable soll der Inhalt von %0 am Schluss landen.
Ist _rval eine Registervariable, wird der Compiler dieses
Register für %0 einsetzen, so dass der msr-Befehl den Status
direkt in _rval schreiben kann. Liegt _rval im RAM, wird
der Compiler einen zusätzlichen Assemblerbefehl generieren,
der den Inhalt des ausgewählten Registers (r0—r31) an die
entsprechende RAM-Adresse kopiert.
-> Rückgabewert des vom Makro erzeugten C-Blocks.
Alles zusammengenommen macht das Makro also den Inhalt des Machine-
Statusregisters für das C-Programm verfügbar. Die Anweisung
schreibt den Inhalt des Statusregisters in die Variable status.
Noch viel mehr zu diesem Thema steht im GCC-Manual in diesen Kapiteln:
http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html
http://gcc.gnu.org/onlinedocs/gcc/Constraints.html
http://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html
http://gcc.gnu.org/onlinedocs/gcc/Explicit-Reg-Vars.html