Ich würde mir das so erklären, dass der Compiler den Assembler-Code nicht anguckt, und daher "weiss", dass die Zeile
mirrorwert = *zeichenbyte;
ohne den Serial.println Befehl (oder ohne volatile) völlig sinnlos ist.
Übrigens:
void mirrorbits(byte *zeichenbyte) { ... }
hat nicht viel zu tun mit deiner Deklaration
void mirrorbits(byte &zeichenbyte);
(die auch ignoriert wird, weil sie nicht verwendet wird)
In
byte save = x;
mirrorbits(&save);
arbeitest du mit Zeigern, nicht mit Referenzen.
Mir persönlich würde eine Funktion wie
byte m = mirrorbyte(x);
übrigens besser gefallen. ( Einfacher, klarer )
avr-objdump ist in deiner Arduino "toolchain" mit enthalten. Viel Spass.