Diese Anweisung ist gar keine wirkliche Anweisung, sondern
ein sogenannter Präprozessormakro. (Präprozessor deshalb,
weil dieser vor dem eigentlichen Compilieren über das
Programm geschickt wird, um include-Dateien einzusammeln
und eben derartige Makros aufzulösen.)
Makro heißt dabei, daß das Wort direkt nach #define der
Name des Makros ist, alles was danach steht, wird dessen
Definition. Wann immer später im Programm ASC1_IBUF
auftaucht, wird der komplette Ausdruck der rechten Seite
an dieser Stelle stattdessen eingefügt (macro expansion).
Die andere Frage ist, was das Stückchen Code dann wohl
an dieser Stelle tun wird. Es muß irgendwo eine Typdefinition
(oder einen weiteren Makro) für "uword" geben, vermuten
wir mal, es handelt sich dabei um eine 16-bit Ganzzahl
ohne Vorzeichen (unsigned int). Der Ausdruck in den
inneren Klammern ist ein sogenannter typecast, also eine
zwangsweise Typumwandlung, in diesem Falle auf einen
Zeiger auf eine solche Zahl. Zusätzlich wird der Compiler
angewiesen, bei Zugriffen über diesen Zeiger keine
Optimierungen durchzuführen, d. h. jedesmal, wenn der
Ausdruck geschrieben steht, muß der Zugriff erneut
ausgeführt werden. Dies macht man typischerweise, wenn
der entsprechende Wert außerhalb des ,,Blickfeldes'' des
Compilers manipuliert worden sein kann. Im vorliegenden
Fall würde ich darauf tippen, daß bei Zugriff auf diese
Adresse externe Hardware angesprochen wird (memory-mapped
IO). Ein anderer typischer Fall für volatile wären
Variablen, die aus einer Interruptroutine heraus
geändert werden sollen.
Schließlich noch der letzte * vor dem typecast: damit wird
der Compiler angewiesen, den Inhalt des entsprechenden
Zeigers zu erfragen, in diesem Falle also der (vermutlich)
16-bit Zahl, die an Adresse 0xFEB8 zu finden ist.
Allerdings ,,zieht'' es in Deinem Beispiel ganz mächtig...
Da fehlen zwei schließenden Klammern.