* (Adr) gibt den unter addr
gespeicherten Wert zurück.
Der obige Code sieht selbsterklärend aus. Wenn du trocken liegst.
Betrachten value = MemoryRead((ptr))
Wird value = (*(volatile unsigned char*)((ptr)))
Die #define
sieht wirklich kryptisch auf den ersten. Der Weg, dies zu verstehen, besteht darin, es in Stücke zu zerlegen, as done here;
Zu allererst
unsigned char
bedeutet, dass wir eine Byte-Größe Speicherplatz verwenden. Byte ist 8-Bit breit.
unsigned char *
bedeutet, dass wir einen Zeiger deklarieren, der auf eine Byte-große Position zeigt.
(unsigned char *) (ptr)
bedeutet der Byte-große Zeiger verweist auf Adresse ptr
. Der C-Compiler verweist auf die Adresse ptr
. Der Assembly-Code wird am Ende mit ptr in Laden (LD) und Store (STR) Anweisungen.
(*(unsigned char *)(ptr))
Der erste Stern von links bedeutet, dass wir den Wert in Adresse ptr
manipulieren wollen. * bedeutet "der Wert, auf den der Zeiger zeigt".
volatile
flüchtige Kräfte die Compiler eine Last zu erteilen oder zu jeder Zeit MemoryRead
Speicher zugegriffen werden als der Wert ohne den Compiler es zu wissen, ändern kann.
So wird jede Adresse, die unter ptr
eingegeben wird, direkt von Ihrem Code zugegriffen. (Wenn die Adresse im Speicher vorhanden ist.)
Dies wurde bereits hunderte Male gefragt und erklärt. Bitte recherchieren Sie über SO, bevor Sie eine Frage stellen. – Lundin