So basically if you write this code :
0x01 = 0x00;
The compiler interprets the 0x01 as a port address and the 0x00 as data the port is set to??
Of course not. "0x01" is an integer constant; it is not a reference to a memory location. This is a reference to a memory location...
(*(volatile uint8_t *)(0x01)) = 0x00; ...even on a PC using Microsoft tools.
The point I'm trying to make is that the compiler used by the Arduino IDE does not use a special C++ like dialect. It is a
C++ compiler. You've heard the phrase, "not your father’s Oldsmobile." Well, it "IS your father's compiler." The "special" thing about the compiler is that it is very compliant with C++ standards; which means the language does not deviate from the Microsoft compiler you used on a PC.
sfr_defs.h is split into two halves;
_SFR_IO8 has two definitions. The definition for assembly files expands to a simple constant. The definition for C files expands to a memory reference like the one above.